NEW contract signed status update (#30779)

* Moved signed status constants to array dictionary

* Added getLibSignedStatus & getSignedStatusLocalisedArray methods

* Updated fetch & create methods for signed_status

* Added signed status to status badge

* Updated signed_status module builder field

* Added object context signed status for action trigger

* Added signed status to contract list

* Fixed signed status for contract list

* Added sign, unsign, confirm_sign, confirm_unsign actions. Added sign button.

* Fixed old contract without signed status

* Added contract modify notification

* Added contract signed status update

* Updated EN localizations

* Fixed contract notification administration

* Fixed notification message

* Fixed contract status badge

* Fixed langs

* Fixed langs key

* Fixed duplicate localization
This commit is contained in:
William Mead 2024-09-10 03:04:49 +02:00 committed by GitHub
parent 4b1b0084c9
commit fb6677010d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 195 additions and 28 deletions

View File

@ -33,7 +33,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/triggers/interface_50_modNotification_Notification.class.php';
// Load translation files required by the page
$langs->loadLangs(array('admin', 'other', 'orders', 'propal', 'bills', 'errors', 'mails'));
$langs->loadLangs(array('admin', 'other', 'orders', 'propal', 'bills', 'errors', 'mails', 'contracts'));
// Security check
if (!$user->admin) {
@ -295,6 +295,8 @@ foreach ($listofnotifiedevents as $notifiedevent) {
$elementLabel = $langs->trans('Shipping');
} elseif ($notifiedevent['elementtype'] == 'expensereport' || $notifiedevent['elementtype'] == 'expense_report') {
$elementLabel = $langs->trans('ExpenseReport');
} elseif ($notifiedevent['elementtype'] == 'contrat') {
$elementLabel = $langs->trans('Contract');
}
if ($notifiedevent['elementtype'] == 'propal') {
@ -315,6 +317,8 @@ foreach ($listofnotifiedevents as $notifiedevent) {
$model = 'invoice_supplier_send';
} elseif ($notifiedevent['elementtype'] == 'member') {
$model = 'member';
} elseif ($notifiedevent['elementtype'] == 'contrat') {
$model = 'contract_send';
}
$constantes[$notifiedevent['code'].'_TEMPLATE'] = array('type'=>'emailtemplate:'.$model, 'label'=>$label);
@ -435,11 +439,14 @@ foreach ($listofnotifiedevents as $notifiedevent) {
} elseif ($notifiedevent['elementtype'] == 'expensereport' || $notifiedevent['elementtype'] == 'expense_report') {
$elementPicto = 'expensereport';
$elementLabel = $langs->trans('ExpenseReport');
} elseif ($notifiedevent['elementtype'] == 'contrat') {
$elementPicto = 'contract';
$elementLabel = $langs->trans('Contract');
} elseif ($notifiedevent['elementtype'] == 'agenda') {
$elementPicto = 'action';
}
$labelfortrigger = 'AmountHT';
$labelfortrigger = 'AmountHT';
$codehasnotrigger = 0;
if (preg_match('/^(ACTION|HOLIDAY)/', $notifiedevent['code'])) {
$codehasnotrigger++;

View File

@ -56,7 +56,7 @@ if (isModEnabled('project')) {
require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
// Load translation files required by the page
$langs->loadLangs(array("contracts", "orders", "companies", "bills", "products", 'compta'));
$langs->loadLangs(array("contracts", "orders", "companies", "bills", "products", 'compta', 'propal'));
$action = GETPOST('action', 'aZ09');
$confirm = GETPOST('confirm', 'alpha');
@ -175,6 +175,22 @@ if (empty($reshook)) {
} else {
setEventMessages($object->error, $object->errors, 'errors');
}
} elseif ($action == 'confirm_sign' && $confirm == 'yes' && $user->hasRight('contract', 'creer')) {
$result = $object->setSignedStatus($user, GETPOSTINT('signed_status'), 0, 'CONTRACT_MODIFY');
if ($result >= 0) {
header('Location: ' . $_SERVER["PHP_SELF"] . '?id=' . $object->id);
exit;
} else {
$mesg = $object->error;
}
} elseif ($action == 'confirm_unsign' && $confirm == 'yes' && $user->hasRight('contract', 'creer')) {
$result = $object->setSignedStatus($user, $object::SIGNED_STATUSES['STATUS_NO_SIGNATURE'], 0, 'CONTRACT_MODIFY');
if ($result >= 0) {
header('Location: ' . $_SERVER["PHP_SELF"] . '?id=' . $object->id);
exit;
} else {
$mesg = $object->error;
}
} elseif ($action == 'confirm_closeline' && $confirm == 'yes' && $permissiontoactivate) {
$date_end = '';
if (GETPOST('endmonth') && GETPOST('endday') && GETPOST('endyear')) {
@ -1363,6 +1379,31 @@ if ($action == 'create') {
// Clone confirmation
$formquestion = array(array('type' => 'other', 'name' => 'socid', 'label' => $langs->trans("SelectThirdParty"), 'value' => $form->select_company(GETPOSTINT('socid'), 'socid', $filter)));
$formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneContract', $object->ref), 'confirm_clone', $formquestion, 'yes', 1);
} elseif ($action == 'sign') {
$text = $langs->trans('ConfirmSignContract');
if (isModEnabled('notification')) {
require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php';
$notify = new Notify($db);
$text .= '<br>';
$text .= $notify->confirmMessage('CONTRACT_MODIFY', $object->socid, $object);
}
$formquestion = [];
$formquestion[] = [
'type' => 'select',
'name' => 'signed_status',
'label' => '<span class="fieldrequired">'.$langs->trans('SignStatus').'</span>',
'values' => $object->getSignedStatusLocalisedArray()
];
$formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('SignContract'), $text, 'confirm_sign', $formquestion, 0, 1);
} elseif ($action == 'unsign') {
$text = $langs->trans('ConfirmUnsignContract');
if (isModEnabled('notification')) {
require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php';
$notify = new Notify($db);
$text .= '<br>';
$text .= $notify->confirmMessage('CONTRACT_MODIFY', $object->socid, $object);
}
$formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('UnsignContract'), $text, 'confirm_unsign', '', 0, 1);
}
@ -2246,6 +2287,15 @@ if ($action == 'create') {
}
}
// Sign
if ($object->status > Contrat::STATUS_DRAFT) {
if ($object->signed_status != Contrat::SIGNED_STATUSES['STATUS_SIGNED_ALL']) {
print '<div class="inline-block divButAction"><a class="butAction" href="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '&action=sign&token=' . newToken() . '">' . $langs->trans("ContractSign") . '</a></div>';
} else {
print '<div class="inline-block divButAction"><a class="butAction" href="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '&action=unsign&token=' . newToken() . '">' . $langs->trans("ContractUnsign") . '</a></div>';
}
}
// Clone
if ($user->hasRight('contrat', 'creer')) {
unset($params['attr']['title']);

View File

@ -238,7 +238,7 @@ class Contrat extends CommonObject
'tms' => array('type' => 'timestamp', 'label' => 'DateModification', 'enabled' => 1, 'visible' => -1, 'notnull' => 1, 'position' => 35),
'datec' => array('type' => 'datetime', 'label' => 'DateCreation', 'enabled' => 1, 'visible' => -1, 'position' => 40),
'date_contrat' => array('type' => 'datetime', 'label' => 'Date contrat', 'enabled' => 1, 'visible' => -1, 'position' => 45),
'signed_status' => array('type' => 'smallint(6)', 'label' => 'SignedStatus', 'enabled' => 1, 'visible' => -1, 'position' => 50, 'arrayofkeyval' => array(0 => 'NoSignature', 1 => 'SignedSender', 2 => 'SignedReceiver', 9 => 'SignedAll')),
'signed_status' => array('type' => 'smallint(6)', 'label' => 'SignedStatus', 'enabled' => 1, 'visible' => -1, 'position' => 50, 'arrayofkeyval' => array(0 => 'NoSignature', 1 => 'SignedSender', 2 => 'SignedReceiver', 3 => 'SignedReceiverOnline', 9 => 'SignedAll')),
'fk_soc' => array('type' => 'integer:Societe:societe/class/societe.class.php', 'label' => 'ThirdParty', 'enabled' => 'isModEnabled("societe")', 'visible' => -1, 'notnull' => 1, 'position' => 70),
'fk_projet' => array('type' => 'integer:Project:projet/class/project.class.php:1:(fk_statut:=:1)', 'label' => 'Project', 'enabled' => "isModEnabled('project')", 'visible' => -1, 'position' => 75),
'fk_commercial_signature' => array('type' => 'integer:User:user/class/user.class.php', 'label' => 'SaleRepresentative Signature', 'enabled' => 1, 'visible' => -1, 'position' => 80),
@ -259,26 +259,16 @@ class Contrat extends CommonObject
const STATUS_VALIDATED = 1;
const STATUS_CLOSED = 2;
/*
* No signature
/**
* Signed statuses dictionary. Label used as key for string localizations.
*/
const STATUS_NO_SIGNATURE = 0;
/*
* Signed by sender
*/
const STATUS_SIGNED_SENDER = 1;
/*
* Signed by receiver
*/
const STATUS_SIGNED_RECEIVER = 2;
/*
* Signed by all
*/
const STATUS_SIGNED_ALL = 9; // To handle future kind of signature (ex: tripartite contract)
const SIGNED_STATUSES = [
'STATUS_NO_SIGNATURE' => 0,
'STATUS_SIGNED_SENDER' => 1,
'STATUS_SIGNED_RECEIVER' => 2,
'STATUS_SIGNED_RECEIVER_ONLINE' => 3,
'STATUS_SIGNED_ALL' => 9 // To handle future kind of signature (ex: tripartite contract)
];
/**
* Constructor
@ -697,6 +687,7 @@ class Contrat extends CommonObject
$sql .= " ref_supplier, ref_customer,";
$sql .= " ref_ext,";
$sql .= " entity,";
$sql .= " signed_status,";
$sql .= " date_contrat as datecontrat,";
$sql .= " fk_user_author,";
$sql .= " fk_projet as fk_project,";
@ -738,6 +729,7 @@ class Contrat extends CommonObject
$this->entity = $obj->entity;
$this->statut = $obj->status;
$this->status = $obj->status;
$this->signed_status = $obj->signed_status;
$this->date_contrat = $this->db->jdate($obj->datecontrat);
$this->date_creation = $this->db->jdate($obj->datecontrat);
@ -1017,7 +1009,7 @@ class Contrat extends CommonObject
// Insert contract
$sql = "INSERT INTO ".MAIN_DB_PREFIX."contrat (datec, fk_soc, fk_user_author, date_contrat,";
$sql .= " fk_commercial_signature, fk_commercial_suivi, fk_projet,";
$sql .= " ref, entity, note_private, note_public, ref_customer, ref_supplier, ref_ext)";
$sql .= " ref, entity, signed_status, note_private, note_public, ref_customer, ref_supplier, ref_ext)";
$sql .= " VALUES ('".$this->db->idate($now)."', ".((int) $this->socid).", ".((int) $user->id);
$sql .= ", ".(dol_strlen($this->date_contrat) != 0 ? "'".$this->db->idate($this->date_contrat)."'" : "NULL");
$sql .= ",".($this->commercial_signature_id > 0 ? ((int) $this->commercial_signature_id) : "NULL");
@ -1025,6 +1017,7 @@ class Contrat extends CommonObject
$sql .= ",".($this->fk_project > 0 ? ((int) $this->fk_project) : "NULL");
$sql .= ", ".(dol_strlen($this->ref) <= 0 ? "null" : "'".$this->db->escape($this->ref)."'");
$sql .= ", ".((int) $conf->entity);
$sql .= ", ".((int) $this->signed_status);
$sql .= ", ".(!empty($this->note_private) ? ("'".$this->db->escape($this->note_private)."'") : "NULL");
$sql .= ", ".(!empty($this->note_public) ? ("'".$this->db->escape($this->note_public)."'") : "NULL");
$sql .= ", ".(!empty($this->ref_customer) ? ("'".$this->db->escape($this->ref_customer)."'") : "NULL");
@ -2001,6 +1994,7 @@ class Contrat extends CommonObject
$text .= ($mode == 7 ? '</span><span class="nowraponall">' : '');
$text .= ($mode != 7 || $this->nbofservicesclosed > 0) ? ($this->nbofservicesclosed.ContratLigne::LibStatut(5, 3, -1, 'class="marginleft2"')) : '';
$text .= ($mode == 7 ? '</span>' : '');
$text .= $this->signed_status != '' ? ' '.$this->getLibSignedStatus(5) : '';
return $text;
} else {
return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode);
@ -2934,8 +2928,6 @@ class Contrat extends CommonObject
return $return;
}
// @Todo getLibSignedStatus, LibSignedStatus
/**
* Set signed status
*
@ -2947,6 +2939,69 @@ class Contrat extends CommonObject
*/
public function setSignedStatus(User $user, int $status = 0, int $notrigger = 0, $triggercode = ''): int
{
global $langs;
$langs->loadLangs(array('contracts', 'commercial'));
$this->signed_status = $status;
$this->context['signature'] = $status;
switch ($status) {
case 0:
$this->context['actionmsg2'] = $langs->transnoentitiesnoconv('ContractUnsignedInDolibarr');
break;
case 1:
$this->context['actionmsg2'] = $langs->transnoentitiesnoconv('SignedSender');
break;
case 2:
$this->context['actionmsg2'] = $langs->transnoentitiesnoconv('SignedReceiver');
break;
case 3:
$this->context['actionmsg2'] = $langs->transnoentitiesnoconv('SignedReceiverOnline');
break;
case 9:
$this->context['actionmsg2'] = $langs->transnoentitiesnoconv('SignedAll');
break;
}
return $this->setSignedStatusCommon($user, $status, $notrigger, $triggercode);
}
/**
* Returns the label for signed status
*
* @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto
* @return string Label
*/
public function getLibSignedStatus(int $mode = 0): string
{
global $langs;
$langs->load("commercial");
$list_signed_status = $this->getSignedStatusLocalisedArray();
$signed_status_label = $this->signed_status != '' ? $list_signed_status[$this->signed_status] : '';
$signed_status_label_short = $this->signed_status != '' ? $list_signed_status[$this->signed_status] : '';
$signed_status_code = 'status'.$this->signed_status;
return dolGetStatus($signed_status_label, $signed_status_label_short, '', $signed_status_code, $mode);
}
/**
* Returns an array of signed statuses with associated localized labels
*
* @return array
*/
public function getSignedStatusLocalisedArray(): array
{
global $langs;
$langs->load("commercial");
$l10n_signed_status_labels = [
self::SIGNED_STATUSES['STATUS_NO_SIGNATURE'] => 'NoSignature',
self::SIGNED_STATUSES['STATUS_SIGNED_SENDER'] => 'SignedSender',
self::SIGNED_STATUSES['STATUS_SIGNED_RECEIVER'] => 'SignedReceiver',
self::SIGNED_STATUSES['STATUS_SIGNED_RECEIVER_ONLINE'] => 'SignedReceiverOnline',
self::SIGNED_STATUSES['STATUS_SIGNED_ALL'] => 'SignedAll'
];
$l10n_signed_status = [];
foreach (self::SIGNED_STATUSES as $signed_status_code) {
$l10n_signed_status[$signed_status_code] = $langs->transnoentitiesnoconv($l10n_signed_status_labels[$signed_status_code]);
}
return $l10n_signed_status;
}
}

View File

@ -71,6 +71,7 @@ $search_ref_customer = GETPOST('search_ref_customer', 'alpha');
$search_ref_supplier = GETPOST('search_ref_supplier', 'alpha');
$search_all = (GETPOST('search_all', 'alphanohtml') != '') ? GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml');
$search_status = GETPOST('search_status', 'alpha');
$search_signed_status = GETPOST('search_signed_status', 'alpha');
$search_user = GETPOST('search_user', 'intcomma');
$search_sale = GETPOST('search_sale', 'intcomma');
$search_product_category = GETPOST('search_product_category', 'intcomma');
@ -194,6 +195,7 @@ $arrayfields = array(
'c.tms' => array('label' => $langs->trans("DateModificationShort"), 'checked' => 0, 'position' => 500),
'lower_planned_end_date' => array('label' => $langs->trans("LowerDateEndPlannedShort"), 'checked' => 1, 'position' => 900, 'help' => $langs->trans("LowerDateEndPlannedShort")),
'status' => array('label' => $langs->trans("Status"), 'checked' => 1, 'position' => 1000),
'c.signed_status' =>array('label' => $langs->trans('SignedStatus'), 'checked' => 0, 'position' => 1001),
);
// Extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
@ -277,6 +279,7 @@ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x'
$search_date_modif_endday = "";
$search_date_modif_end = "";
$search_status = "";
$search_signed_status = '';
$toselect = array();
$search_type_thirdparty = '';
$searchCategoryCustomerList = array();
@ -307,7 +310,7 @@ $now = dol_now();
$title = "";
$sql = 'SELECT';
$sql .= " c.rowid, c.ref, c.datec as date_creation, c.tms as date_modification, c.date_contrat, c.statut, c.ref_customer, c.ref_supplier, c.note_private, c.note_public, c.entity,";
$sql .= " c.rowid, c.ref, c.datec as date_creation, c.tms as date_modification, c.date_contrat, c.statut, c.ref_customer, c.ref_supplier, c.note_private, c.note_public, c.entity, c.signed_status,";
$sql .= ' s.rowid as socid, s.nom as name, s.name_alias, s.email, s.town, s.zip, s.fk_pays as country_id, s.client, s.code_client, s.status as company_status, s.logo as company_logo,';
$sql .= " typent.code as typent_code,";
$sql .= " state.code_departement as state_code, state.nom as state_name,";
@ -489,6 +492,9 @@ if ($search_date_modif_start) {
if ($search_date_modif_end) {
$sql .= " AND c.tms <= '".$db->idate($search_date_modif_end)."'";
}
if ($search_signed_status != '' && $search_signed_status >= 0) {
$sql .= ' AND c.signed_status = '.urlencode($search_signed_status);
}
// Add where from extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
@ -713,6 +719,9 @@ if ($search_dfyear > 0) {
if ($search_dfmonth > 0) {
$param .= '&search_dfmonth='.urlencode((string) ($search_dfmonth));
}
if ($search_signed_status != '' && $search_signed_status >= 0) {
$param .= '&search_signed_status='.urlencode($search_signed_status);
}
if ($search_sale > 0) {
$param .= '&search_sale='.urlencode($search_sale);
}
@ -933,6 +942,13 @@ if (!empty($arrayfields['c.date_contrat']['checked'])) {
print '</div>';
print '</td>';
}
// Signed status
if (!empty($arrayfields['c.signed_status']['checked'])) {
print '<td class="liste_titre center">';
$list_signed_status = $object->getSignedStatusLocalisedArray();
print $form->selectarray('search_signed_status', $list_signed_status, $search_signed_status, 1, 0, 0, '', 1, 0, 0, '', 'search_status');
print '</td>';
}
// Extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
@ -1045,6 +1061,10 @@ if (!empty($arrayfields['c.date_contrat']['checked'])) {
print_liste_field_titre($arrayfields['c.date_contrat']['label'], $_SERVER["PHP_SELF"], "c.date_contrat", "", $param, '', $sortfield, $sortorder, 'center ');
$totalarray['nbfield']++; // For the column action
}
if (!empty($arrayfields['c.signed_status']['checked'])) {
print_liste_field_titre($arrayfields['c.signed_status']['label'], $_SERVER["PHP_SELF"], "c.signed_status", "", $param, '', $sortfield, $sortorder, 'center ');
$totalarray['nbfield']++;
}
// Extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
// Hook fields
@ -1103,6 +1123,7 @@ while ($i < $imaxinloop) {
$contracttmp->nbofservicesopened = $obj->nb_running;
$contracttmp->nbofservicesexpired = $obj->nb_expired;
$contracttmp->nbofservicesclosed = $obj->nb_closed;
$contracttmp->signed_status = $obj->signed_status;
$socstatic->id = $obj->socid;
$socstatic->name = $obj->name;
@ -1296,6 +1317,13 @@ while ($i < $imaxinloop) {
if (!empty($arrayfields['c.date_contrat']['checked'])) {
print '<td class="center">'.dol_print_date($db->jdate($obj->date_contrat), 'day', 'tzserver').'</td>';
}
// Signed Status
if (!empty($arrayfields['c.signed_status']['checked'])) {
print '<td class="center">'.$contracttmp->getLibSignedStatus(5).'</td>';
if (!$i) {
$totalarray['nbfield']++;
}
}
// Extra fields
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
// Fields from hook

View File

@ -434,6 +434,8 @@ if ($action == "importSignature") {
// Document format not supported to insert online signature.
// We should just create an image file with the signature.
}
$user = new User($db);
$object->setSignedStatus($user, $object::SIGNED_STATUSES['STATUS_SIGNED_RECEIVER_ONLINE'], 0, 'CONTRACT_MODIFY');
}
} elseif ($mode == 'fichinter') {
require_once DOL_DOCUMENT_ROOT . '/fichinter/class/fichinter.class.php';

View File

@ -149,7 +149,8 @@ class Notify
'EXPENSE_REPORT_APPROVE',
'HOLIDAY_VALIDATE',
'HOLIDAY_APPROVE',
'ACTION_CREATE'
'ACTION_CREATE',
'CONTRACT_MODIFY'
);
/**
@ -904,6 +905,13 @@ class Notify
$object_type = 'action';
$mesg = $outputlangs->transnoentitiesnoconv("EMailTextActionAdded", $link);
break;
case 'CONTRACT_MODIFY':
$link = '<a href="'.$urlwithroot.'/contrat/card.php?id='.$object->id.'&entity='.$object->entity.'">'.$newref.'</a>';
$context_info = array_key_exists('signature', $object->context) ? $object->getLibSignedStatus() : '';
$dir_output = $conf->contract->multidir_output;
$object_type = 'contract';
$mesg = $outputlangs->transnoentitiesnoconv("EMailTextContractModified", $link, $context_info);
break;
default:
$object_type = $object->element;
$dir_output = $conf->$object_type->multidir_output[$object->entity ? $object->entity : $conf->entity]."/".get_exdir(0, 0, 0, 1, $object, $object_type);
@ -1202,6 +1210,13 @@ class Notify
$object_type = 'action';
$mesg = $langs->transnoentitiesnoconv("EMailTextActionAdded", $link);
break;
case 'CONTRACT_MODIFY':
$link = '<a href="'.$urlwithroot.'/contrat/card.php?id='.$object->id.'&entity='.$object->entity.'">'.$newref.'</a>';
$context_info = array_key_exists('signature', $object->context) ? $object->getLibSignedStatus() : '';
$dir_output = $conf->contract->multidir_output;
$object_type = 'contrat';
$mesg = $langs->transnoentitiesnoconv("EMailTextContractModified", $link, $context_info);
break;
default:
$object_type = $object->element;
$dir_output = $conf->$object_type->multidir_output[$object->entity ? $object->entity : $conf->entity]."/".get_exdir(0, 0, 0, 1, $object, $object_type);

View File

@ -36,10 +36,18 @@ ActivateAllOnContract=Activate all services
CloseAContract=Close a contract
ConfirmDeleteAContract=Are you sure you want to delete this contract and all its services?
ConfirmValidateContract=Are you sure you want to validate this contract under name <b>%s</b>?
ConfirmSignContract=Are you sure you want to set this contract as signed ?
ConfirmUnsignContract=Are you sure you want to set this contract as unsigned ?
ConfirmActivateAllOnContract=This will open all services (not yet active). Are you sure you want to open all services?
ConfirmCloseContract=This will close all services (expired or not). Are you sure you want to close this contract?
ConfirmCloseService=Are you sure you want to close this service with date <b>%s</b>?
ValidateAContract=Validate a contract
UnsignContract=Unsign contract
ContractSign=Set Signed
ContractUnsign=Set Unsigned
ContractSignedInDolibarr=Contract signed
ContractSignedOnline=Contract signed online
ContractUnsignedInDolibarr=Contract unsigned
ActivateService=Activate service
ConfirmActivateService=Are you sure you want to activate this service with date <b>%s</b>?
RefContract=Contract reference

View File

@ -70,6 +70,7 @@ Notify_BILL_SUPPLIER_VALIDATE=Vendor invoice validated
Notify_BILL_SUPPLIER_PAYED=Vendor invoice paid
Notify_BILL_SUPPLIER_SENTBYMAIL=Vendor invoice sent by mail
Notify_BILL_SUPPLIER_CANCELED=Vendor invoice canceled
Notify_CONTRACT_MODIFY=Contract modified
Notify_CONTRACT_VALIDATE=Contract validated
Notify_FICHINTER_VALIDATE=Intervention validated
Notify_FICHINTER_MODIFY=Intervention modified
@ -234,6 +235,7 @@ EMailTextExpenseReportApproved=Expense report %s has been approved.
EMailTextHolidayValidated=Leave request %s has been validated.
EMailTextHolidayApproved=Leave request %s has been approved.
EMailTextActionAdded=The action %s has been added to the Agenda.
EMailTextContractModified=The contract %s has been modified. %s
ImportedWithSet=Importation data set
DolibarrNotification=Automatic notification
ResizeDesc=Enter new width <b>OR</b> new height. Ratio will be kept during resizing...