26if (!defined(
'NOTOKENRENEWAL')) {
27 define(
'NOTOKENRENEWAL',
'1');
29if (!defined(
'NOREQUIREHTML')) {
30 define(
'NOREQUIREHTML',
'1');
32if (!defined(
'NOREQUIREAJAX')) {
33 define(
'NOREQUIREAJAX',
'1');
40if (!defined(
'NOREQUIREMENU')) {
41 define(
'NOREQUIREMENU',
'1');
44if (!defined(
"NOLOGIN")) {
45 define(
"NOLOGIN",
'1');
47if (!defined(
'NOIPCHECK')) {
48 define(
'NOIPCHECK',
'1');
50if (!defined(
'NOBROWSERNOTIF')) {
51 define(
'NOBROWSERNOTIF',
'1');
53$entity = (!empty($_GET[
'entity']) ? (int) $_GET[
'entity'] : (!empty($_POST[
'entity']) ? (int) $_POST[
'entity'] : 1));
54if (is_numeric($entity)) {
55 define(
"DOLENTITY", $entity);
57include
'../../main.inc.php';
58require_once DOL_DOCUMENT_ROOT .
'/core/lib/files.lib.php';
67$action =
GETPOST(
'action',
'aZ09');
69$signature =
GETPOST(
'signaturebase64');
76$SECUREKEY =
GETPOST(
"securekey");
77$online_sign_name =
GETPOST(
"onlinesignname");
84global $dolibarr_main_instance_unique_id;
85$defaultsalt = substr(
dol_hash(
'dolibarr'.$dolibarr_main_instance_unique_id,
'sha256'), 0, 32);
89if ($type ==
'proposal') {
90 $securekeyseed =
getDolGlobalString(
'PROPOSAL_ONLINE_SIGNATURE_SECURITY_TOKEN', $defaultsalt);
91} elseif ($type ==
'contract') {
92 $securekeyseed =
getDolGlobalString(
'CONTRACT_ONLINE_SIGNATURE_SECURITY_TOKEN', $defaultsalt);
93} elseif ($type ==
'fichinter') {
94 $securekeyseed =
getDolGlobalString(
'FICHINTER_ONLINE_SIGNATURE_SECURITY_TOKEN', $defaultsalt);
96 $securekeyseed =
getDolGlobalString(strtoupper($type).
'_ONLINE_SIGNATURE_SECURITY_TOKEN', $defaultsalt);
99if (empty($SECUREKEY) || !
dol_verifyHash($securekeyseed . $type . $ref . (!
isModEnabled(
'multicompany') ?
'' : $entity), $SECUREKEY,
'0')) {
105$hookmanager->initHooks(array(
'ajaxonlinesign'));
121if ($action ==
"importSignature") {
122 $issignatureok = (!empty($signature) && $signature[0] ==
"image/png;base64");
123 if ($issignatureok) {
124 $signature = $signature[1];
125 $data = base64_decode($signature);
127 if ($mode ==
"propale" || $mode ==
'proposal') {
128 require_once DOL_DOCUMENT_ROOT .
'/comm/propal/class/propal.class.php';
129 require_once DOL_DOCUMENT_ROOT .
'/core/lib/pdf.lib.php';
130 require_once DOL_DOCUMENT_ROOT .
'/core/lib/date.lib.php';
134 if (
getDolGlobalInt(
'PROPOSAL_ONLINESIGN_REFUSE_IF_VALIDITY_DATE_PASSED') && !empty(
$object->fin_validite)
138 $langs->load(
"errors");
139 print $langs->transnoentitiesnoconv(
"ErrorProposalValidityDatePassed",
dol_print_date(
$object->fin_validite,
'day'));
141 } elseif (
$object->status != $object::STATUS_VALIDATED) {
144 $langs->load(
"errors");
145 print $langs->transnoentitiesnoconv(
"ErrorCantSignDocument");
154 $langs->loadLangs(array(
"main",
"companies"));
157 $filename =
"signatures/" . $date .
"_signature.png";
158 if (!$error && !is_dir($upload_dir .
"signatures/")) {
159 if (!
dol_mkdir($upload_dir .
"signatures/")) {
160 $response =
"Error mkdir. Failed to create dir " . $upload_dir .
"signatures/";
166 $return = file_put_contents($upload_dir.$filename, $data);
167 if ($return ===
false) {
169 $response =
'Error file_put_content: failed to create signature file.';
177 $last_main_doc_file =
$object->last_main_doc;
178 $directdownloadlink =
$object->getLastMainDocLink(
'proposal');
180 if (preg_match(
'/\.pdf/i', $last_main_doc_file)) {
181 $ref_pdf = pathinfo($last_main_doc_file, PATHINFO_FILENAME);
182 $ref_pdf = preg_replace(
'/_signed-(\d+)/',
'', $ref_pdf);
184 $newpdffilename = $upload_dir . $ref_pdf .
"_signed-" . $date .
".pdf";
185 $sourcefile = $upload_dir . $ref_pdf .
".pdf";
188 $parameters = array(
'sourcefile' => $sourcefile,
'newpdffilename' => $newpdffilename);
189 $reshook = $hookmanager->executeHooks(
'AddSignature', $parameters,
$object, $action);
191 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
194 if (empty($reshook)) {
197 $page_largeur = $formatarray[
'width'];
198 $page_hauteur = $formatarray[
'height'];
199 $format = array($page_largeur, $page_hauteur);
202 if (class_exists(
'TCPDF')) {
203 $pdf->setPrintHeader(
false);
204 $pdf->setPrintFooter(
false);
209 $pdf->SetCompression(
false);
213 $pagecount = $pdf->setSourceFile($sourcefile);
216 $param[
'online_sign_name'] = $online_sign_name;
217 $param[
'pathtoimage'] = $upload_dir . $filename;
219 $propalsignonspecificpage =
getDolGlobalInt(
"PROPAL_SIGNATURE_ON_SPECIFIC_PAGE");
222 for ($i = 1; $i < ($pagecount + 1); $i++) {
224 $tppl = $pdf->importPage($i);
225 $s = $pdf->getTemplatesize($tppl);
226 $format = array($s[
'w'], $s[
'h']);
227 $pdf->AddPage($s[
'h'] > $s[
'w'] ?
'P' :
'L', $format);
228 $pdf->useTemplate($tppl);
230 if ($propalsignonspecificpage < 0) {
231 $propalsignonspecificpage = $pagecount - abs($propalsignonspecificpage);
234 if (empty($propalsignonspecificpage)) {
239 if (preg_match(
'/PAGESIGN=(\d+)/', $keywords, $reg)) {
240 $propalsignonspecificpage = (int) $reg[1];
244 if (
getDolGlobalString(
"PROPAL_SIGNATURE_ON_ALL_PAGES") || $propalsignonspecificpage == $i) {
251 $param[
'xforimgstart'] = (empty($s[
'w']) ? 120 : round($s[
'w'] / 2) + 15);
256 $param[
'yforimgstart'] = (empty($s[
'h']) ? 240 : $s[
'h'] - 60);
261 $param[
'wforimg'] = $s[
'w'] - 20 - $param[
'xforimgstart'];
267 dol_syslog(
"Error when manipulating the PDF " . $sourcefile .
" by onlineSign: " . $e->getMessage(), LOG_ERR);
268 $response = $e->getMessage();
273 if (!
getDolGlobalString(
"PROPAL_SIGNATURE_ON_ALL_PAGES") && !$propalsignonspecificpage) {
279 $param[
'xforimgstart'] = (empty($s[
'w']) ? 120 : round($s[
'w'] / 2) + 15);
284 $param[
'yforimgstart'] = (empty($s[
'h']) ? 240 : $s[
'h'] - 60);
289 $param[
'wforimg'] = $s[
'w'] - 20 - $param[
'xforimgstart'];
296 $pdf->Output($newpdffilename,
"F");
299 $object->indexFile($newpdffilename, 1);
302 } elseif (preg_match(
'/\.odt/i', $last_main_doc_file)) {
316 $sql =
"UPDATE " . MAIN_DB_PREFIX .
"propal";
317 $sql .=
" SET fk_statut = " . ((int) $object::STATUS_SIGNED) .
", note_private = '" . $db->escape(
$object->note_private) .
"',";
318 $sql .=
" date_signature = '" . $db->idate(
dol_now()) .
"',";
319 $sql .=
" online_sign_ip = '" . $db->escape($online_sign_ip) .
"'";
320 if ($online_sign_name) {
321 $sql .=
", online_sign_name = '" . $db->escape($online_sign_name) .
"'";
323 $sql .=
" WHERE rowid = " . ((int)
$object->id);
324 $sql .=
" AND fk_statut = ".((int) $object::STATUS_VALIDATED);
327 $resql = $db->query($sql);
330 $response =
"error sql";
332 $num = $db->affected_rows($resql);
335 $langs->load(
"errors");
337 print $langs->transnoentitiesnoconv(
"ErrorCantSignDocument");
342 if (method_exists(
$object,
'call_trigger')) {
343 $object->context = array(
'closedfromonlinesignature' =>
'closedfromonlinesignature');
345 $result =
$object->call_trigger(
'PROPAL_CLOSE_SIGNED', $user);
348 $response =
"error in trigger " .
$object->error;
352 $result = $soc->setAsCustomer();
355 $response = $db->lasterror();
357 $response =
"success";
361 $response =
"success";
367 $response =
"success";
368 setEventMessages(
"PropalSigned",
null,
'mesgs');
373 } elseif ($mode ==
'contract') {
374 require_once DOL_DOCUMENT_ROOT .
'/contrat/class/contrat.class.php';
375 require_once DOL_DOCUMENT_ROOT .
'/core/lib/pdf.lib.php';
383 $filename =
"signatures/" . $date .
"_signature.png";
384 if (!is_dir($upload_dir .
"signatures/")) {
385 if (!
dol_mkdir($upload_dir .
"signatures/")) {
386 $response =
"Error mkdir. Failed to create dir " . $upload_dir .
"signatures/";
392 $return = file_put_contents($upload_dir . $filename, $data);
393 if ($return ===
false) {
395 $response =
'Error file_put_content: failed to create signature file.';
403 $last_main_doc_file =
$object->last_main_doc;
404 $directdownloadlink =
$object->getLastMainDocLink(
'contrat');
406 if (preg_match(
'/\.pdf/i', $last_main_doc_file)) {
407 $ref_pdf = pathinfo($last_main_doc_file, PATHINFO_FILENAME);
409 $newpdffilename = $upload_dir . $ref_pdf .
"_signed-" . $date .
".pdf";
410 $sourcefile = $upload_dir . $ref_pdf .
".pdf";
413 $parameters = array(
'sourcefile' => $sourcefile,
'newpdffilename' => $newpdffilename);
414 $reshook = $hookmanager->executeHooks(
'AddSignature', $parameters,
$object, $action);
416 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
419 if (empty($reshook)) {
422 if (class_exists(
'TCPDF')) {
423 $pdf->setPrintHeader(
false);
424 $pdf->setPrintFooter(
false);
429 $pdf->SetCompression(
false);
433 $pagecount = $pdf->setSourceFile($sourcefile);
436 $param[
'online_sign_name'] = $online_sign_name;
437 $param[
'pathtoimage'] = $upload_dir . $filename;
440 for ($i = 1; $i < ($pagecount + 1); $i++) {
442 $tppl = $pdf->importPage($i);
443 $s = $pdf->getTemplatesize($tppl);
444 $pdf->AddPage($s[
'h'] > $s[
'w'] ?
'P' :
'L');
445 $pdf->useTemplate($tppl);
454 $param[
'xforimgstart'] = (empty($s[
'w']) ? 110 : $s[
'w'] / 2 - 0);
459 $param[
'yforimgstart'] = (empty($s[
'h']) ? 250 : $s[
'h'] - 62);
464 $param[
'wforimg'] = $s[
'w'] - ($param[
'xforimgstart'] + 16);
470 dol_syslog(
"Error when manipulating some PDF by onlineSign: " . $e->getMessage(), LOG_ERR);
471 $response = $e->getMessage();
480 $param[
'xforimgstart'] = (empty($s[
'w']) ? 110 : $s[
'w'] / 2 - 0);
481 $param[
'yforimgstart'] = (empty($s[
'h']) ? 250 : $s[
'h'] - 62);
482 $param[
'wforimg'] = $s[
'w'] - ($param[
'xforimgstart'] + 16);
488 $pdf->Output($newpdffilename,
"F");
491 $object->indexFile($newpdffilename, 1);
495 $response =
"success";
497 } elseif (preg_match(
'/\.odt/i', $last_main_doc_file)) {
504 $user =
new User($db);
505 $object->setSignedStatus($user, Contrat::$SIGNED_STATUSES[
'STATUS_SIGNED_RECEIVER_ONLINE'], 0,
'CONTRACT_MODIFY');
507 } elseif ($mode ==
'order') {
508 require_once DOL_DOCUMENT_ROOT .
'/commande/class/commande.class.php';
509 require_once DOL_DOCUMENT_ROOT .
'/core/lib/pdf.lib.php';
517 $filename =
"signatures/" . $date .
"_signature.png";
518 if (!is_dir($upload_dir .
"signatures/")) {
519 if (!
dol_mkdir($upload_dir .
"signatures/")) {
520 $response =
"Error mkdir. Failed to create dir " . $upload_dir .
"signatures/";
526 $return = file_put_contents($upload_dir . $filename, $data);
527 if ($return ===
false) {
529 $response =
'Error file_put_content: failed to create signature file.';
537 $last_main_doc_file =
$object->last_main_doc;
538 $directdownloadlink =
$object->getLastMainDocLink(
'order');
540 if (preg_match(
'/\.pdf/i', $last_main_doc_file)) {
541 $ref_pdf = pathinfo($last_main_doc_file, PATHINFO_FILENAME);
542 $ref_pdf = preg_replace(
'/_signed-(\d+)/',
'', $ref_pdf);
544 $newpdffilename = $upload_dir . $ref_pdf .
"_signed-" . $date .
".pdf";
545 $sourcefile = $upload_dir . $ref_pdf .
".pdf";
548 $parameters = array(
'sourcefile' => $sourcefile,
'newpdffilename' => $newpdffilename);
549 $reshook = $hookmanager->executeHooks(
'AddSignature', $parameters,
$object, $action);
551 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
554 if (empty($reshook)) {
557 if (class_exists(
'TCPDF')) {
558 $pdf->setPrintHeader(
false);
559 $pdf->setPrintFooter(
false);
564 $pdf->SetCompression(
false);
568 $pagecount = $pdf->setSourceFile($sourcefile);
571 $param[
'online_sign_name'] = $online_sign_name;
572 $param[
'pathtoimage'] = $upload_dir . $filename;
575 for ($i = 1; $i < ($pagecount + 1); $i++) {
577 $tppl = $pdf->importPage($i);
578 $s = $pdf->getTemplatesize($tppl);
579 $pdf->AddPage($s[
'h'] > $s[
'w'] ?
'P' :
'L');
580 $pdf->useTemplate($tppl);
589 $param[
'xforimgstart'] = (empty($s[
'w']) ? 120 : round($s[
'w'] / 2) + 15);
594 $param[
'yforimgstart'] = (empty($s[
'h']) ? 240 : $s[
'h'] - 60);
599 $param[
'wforimg'] = $s[
'w'] - 20 - $param[
'xforimgstart'];
605 dol_syslog(
"Error when manipulating some PDF by onlineSign: " . $e->getMessage(), LOG_ERR);
606 $response = $e->getMessage();
618 $param[
'xforimgstart'] = (empty($s[
'w']) ? 120 : round($s[
'w'] / 2) + 15);
623 $param[
'yforimgstart'] = (empty($s[
'h']) ? 240 : $s[
'h'] - 60);
628 $param[
'wforimg'] = $s[
'w'] - 20 - $param[
'xforimgstart'];
635 $pdf->Output($newpdffilename,
"F");
638 $object->indexFile($newpdffilename, 1);
642 $response =
"success";
644 } elseif (preg_match(
'/\.odt/i', $last_main_doc_file)) {
656 $sql =
"UPDATE " . MAIN_DB_PREFIX .
"commande";
657 $sql .=
" SET fk_statut = " . ((int) $object::STATUS_VALIDATED) .
", note_private = '" . $db->escape(
$object->note_private) .
"',";
658 $sql .=
" date_signature = '" . $db->idate(
dol_now()) .
"',";
659 $sql .=
" online_sign_ip = '" . $db->escape($online_sign_ip) .
"'";
660 if ($online_sign_name) {
661 $sql .=
", online_sign_name = '" . $db->escape($online_sign_name) .
"'";
663 $sql .=
" WHERE rowid = " . ((int)
$object->id);
666 $resql = $db->query($sql);
670 $num = $db->affected_rows($resql);
674 $user =
new User($db);
675 $user->fetch(
$object->user_author_id);
676 $object->context = array(
'closedfromonlinesignature' =>
'closedfromonlinesignature');
677 $result =
$object->call_trigger(
'ORDER_CLOSE_SIGNED', $user);
680 $response =
"error in trigger " .
$object->error;
682 $response =
"success";
686 $response =
"error sql";
691 $response =
"success";
692 setEventMessages(
"OrderSigned",
null,
'warnings');
698 } elseif ($mode ==
'fichinter') {
699 require_once DOL_DOCUMENT_ROOT .
'/fichinter/class/fichinter.class.php';
700 require_once DOL_DOCUMENT_ROOT .
'/core/lib/pdf.lib.php';
704 $upload_dir = !empty(
$conf->ficheinter->multidir_output[
$object->entity ??
$conf->entity]) ?
$conf->ficheinter->multidir_output[
$object->entity ??
$conf->entity] :
$conf->ficheinter->dir_output;
705 $upload_dir .=
'/'.dol_sanitizeFileName(
$object->ref).
'/';
707 $langs->loadLangs(array(
"main",
"companies"));
713 $filename =
"signatures/" . $date .
"_signature.png";
714 if (!is_dir($upload_dir .
"signatures/")) {
715 if (!
dol_mkdir($upload_dir .
"signatures/")) {
716 $response =
"Error mkdir. Failed to create dir " . $upload_dir .
"signatures/";
722 $return = file_put_contents($upload_dir . $filename, $data);
723 if ($return ===
false) {
725 $response =
'Error file_put_content: failed to create signature file.';
733 $last_main_doc_file =
$object->last_main_doc;
734 $directdownloadlink =
$object->getLastMainDocLink(
'fichinter');
736 if (preg_match(
'/\.pdf/i', $last_main_doc_file)) {
737 $ref_pdf = pathinfo($last_main_doc_file, PATHINFO_FILENAME);
739 $newpdffilename = $upload_dir . $ref_pdf .
"_signed-" . $date .
".pdf";
740 $sourcefile = $upload_dir . $ref_pdf .
".pdf";
743 $parameters = array(
'sourcefile' => $sourcefile,
'newpdffilename' => $newpdffilename);
744 $reshook = $hookmanager->executeHooks(
'AddSignature', $parameters,
$object, $action);
746 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
749 if (empty($reshook)) {
752 if (class_exists(
'TCPDF')) {
753 $pdf->setPrintHeader(
false);
754 $pdf->setPrintFooter(
false);
759 $pdf->SetCompression(
false);
763 $pagecount = $pdf->setSourceFile($sourcefile);
766 $param[
'online_sign_name'] = $online_sign_name;
767 $param[
'pathtoimage'] = $upload_dir . $filename;
770 for ($i = 1; $i < ($pagecount + 1); $i++) {
772 $tppl = $pdf->importPage($i);
773 $s = $pdf->getTemplatesize($tppl);
774 $pdf->AddPage($s[
'h'] > $s[
'w'] ?
'P' :
'L');
775 $pdf->useTemplate($tppl);
784 $param[
'xforimgstart'] = (empty($s[
'w']) ? 110 : round($s[
'w'] * 0.53));
789 $param[
'yforimgstart'] = (empty($s[
'h']) ? 250 : $s[
'h'] - 60);
794 $param[
'wforimg'] = $s[
'w'] - ($param[
'xforimgstart'] + 16);
800 dol_syslog(
"Error when manipulating some PDF by onlineSign: " . $e->getMessage(), LOG_ERR);
801 $response = $e->getMessage();
810 $param[
'xforimgstart'] = (empty($s[
'w']) ? 110 : round($s[
'w'] * 0.53));
811 $param[
'yforimgstart'] = (empty($s[
'h']) ? 250 : $s[
'h'] - 60);
812 $param[
'wforimg'] = $s[
'w'] - ($param[
'xforimgstart'] + 16);
818 $pdf->Output($newpdffilename,
"F");
821 $object->indexFile($newpdffilename, 1);
825 $response =
"success";
827 } elseif (preg_match(
'/\.odt/i', $last_main_doc_file)) {
834 $user =
new User($db);
835 $object->setSignedStatus($user, Fichinter::$SIGNED_STATUSES[
'STATUS_SIGNED_RECEIVER_ONLINE'], 0,
'FICHINTER_MODIFY');
837 } elseif ($mode ==
"societe_rib") {
838 $langs->load(
'withdrawals');
839 require_once DOL_DOCUMENT_ROOT .
'/societe/class/companybankaccount.class.php';
840 require_once DOL_DOCUMENT_ROOT .
'/core/lib/pdf.lib.php';
841 $modelpath =
"core/modules/bank/doc/";
851 $langs->loadLangs(array(
"main",
"companies"));
854 $filename =
"signatures/" . $date .
"_signature.png";
855 if (!
dol_is_dir($upload_dir .
"signatures/")) {
856 if (!
dol_mkdir($upload_dir .
"signatures/")) {
857 $response =
"Error mkdir. Failed to create dir " . $upload_dir .
"signatures/";
862 $response =
"Error directory " . $upload_dir .
"signatures/ is not writable";
866 $response =
"Error directory " . DOL_DATA_ROOT.
"/admin/temp/ is not writable";
871 $return = file_put_contents($upload_dir . $filename, $data);
872 if ($return ===
false) {
874 $response =
'Error file_put_content: failed to create signature file.';
882 $last_main_doc_file =
$object->last_main_doc;
883 $last_modelpdf =
$object->model_pdf;
884 $directdownloadlink =
$object->getLastMainDocLink(
'company');
886 if (preg_match(
'/\.pdf/i', $last_main_doc_file)) {
888 $newpdffilename =
'';
889 if ($last_modelpdf ==
'sepamandate') {
897 $sourcefile = DOL_DATA_ROOT .
'/' . $last_main_doc_file;
898 $newpdffilename = preg_replace(
'/\.pdf$/i',
'_signed-' . $date .
'.pdf', $sourcefile);
901 $parameters = array(
'sourcefile' => $sourcefile,
'newpdffilename' => $newpdffilename);
902 $reshook = $hookmanager->executeHooks(
'AddSignature', $parameters,
$object, $action);
904 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
907 if (empty($reshook)) {
910 if (class_exists(
'TCPDF')) {
911 $pdf->setPrintHeader(
false);
912 $pdf->setPrintFooter(
false);
917 $pdf->SetCompression(
false);
921 $pagecount = $pdf->setSourceFile($sourcefile);
924 for ($i = 1; $i < ($pagecount + 1); $i++) {
926 $tppl = $pdf->importPage($i);
927 $s = $pdf->getTemplatesize($tppl);
928 $pdf->AddPage($s[
'h'] > $s[
'w'] ?
'P' :
'L');
929 $pdf->useTemplate($tppl);
931 dol_syslog(
"Error when manipulating the PDF " . $sourcefile .
" by onlineSign: " . $e->getMessage(), LOG_ERR);
932 $response = $e->getMessage();
942 $dirmodels = array(
'/');
943 if (is_array(
$conf->modules_parts[
'models'])) {
944 $dirmodels = array_merge($dirmodels,
$conf->modules_parts[
'models']);
946 foreach ($dirmodels as $reldir) {
947 $file =
"pdf_" . $last_modelpdf .
".modules.php";
950 if (file_exists($file)) {
952 $classname =
'pdf_' . $last_modelpdf;
957 if ($filefound ===
'') {
958 $response = $langs->trans(
"Error") .
' Failed to load doc generator with modelpaths=' . $modelpath .
' - modele=' . $last_modelpdf;
963 if (!$error && $classname !==
'') {
967 $objPDF =
new $classname($db);
969 $pdf->SetFont($default_font,
'', $default_font_size - 1);
971 $xForDate = $objPDF->marge_gauche;
972 $yForDate = $objPDF->page_hauteur - $objPDF->heightforinfotot - $objPDF->heightforfreetext - $objPDF->heightforfooter + 10;
973 $pdf->SetXY($xForDate, $yForDate);
976 $xforimgstart = $objPDF->xPosSignArea;
977 $yforimgstart = $yForDate - 5;
978 $wforimg = $s[
'w'] - 20 - $xforimgstart;
981 $param[
'online_sign_name'] = $online_sign_name;
982 $param[
'pathtoimage'] = $upload_dir . $filename;
987 $param[
'xforimgstart'] = $xforimgstart;
988 $param[
'yforimgstart'] = $yforimgstart;
989 $param[
'wforimg'] = $wforimg;
994 $pdf->Output($newpdffilename,
"F");
997 $object->indexFile($newpdffilename, 1);
1000 } elseif (preg_match(
'/\.odt/i', $last_main_doc_file)) {
1010 $response =
"cannot find BAN/RIB";
1018 $sql =
"UPDATE " . MAIN_DB_PREFIX . $db->sanitize(
$object->table_element);
1020 $sql .=
" date_signature = '" . $db->idate(
dol_now()) .
"',";
1021 $sql .=
" online_sign_ip = '" . $db->escape($online_sign_ip) .
"'";
1022 if ($online_sign_name) {
1023 $sql .=
", online_sign_name = '" . $db->escape($online_sign_name) .
"'";
1027 $sql .=
" WHERE rowid = " . ((int)
$object->id);
1030 $resql = $db->query($sql);
1034 $num = $db->affected_rows($resql);
1038 $response =
"success";
1041 $response =
"error sql";
1046 $response =
"success";
1047 setEventMessages(
dol_ucfirst($mode).
"Signed",
null,
'warnings');
1052 } elseif ($mode ==
'expedition') {
1053 require_once DOL_DOCUMENT_ROOT .
'/expedition/class/expedition.class.php';
1054 require_once DOL_DOCUMENT_ROOT .
'/core/lib/pdf.lib.php';
1059 $upload_dir =
$conf->expedition->dir_output.
"/sending/";
1060 $upload_dir .=
'/'.dol_sanitizeFileName(
$object->ref).
'/';
1062 $langs->loadLangs(array(
"main",
"companies"));
1068 $filename =
"signatures/" . $date .
"_signature.png";
1069 if (!is_dir($upload_dir .
"signatures/")) {
1070 if (!
dol_mkdir($upload_dir .
"signatures/")) {
1071 $response =
"Error mkdir. Failed to create dir " . $upload_dir .
"signatures/";
1077 $return = file_put_contents($upload_dir . $filename, $data);
1078 if ($return ===
false) {
1080 $response =
'Error file_put_content: failed to create signature file.';
1087 $last_main_doc_file =
$object->last_main_doc;
1089 if (empty($last_main_doc_file) || !
dol_is_file(DOL_DATA_ROOT.
'/'.
$object->last_main_doc)) {
1092 $defaulttemplate =
'';
1093 $object->generateDocument($defaulttemplate, $langs);
1095 $last_main_doc_file =
$object->last_main_doc;
1096 $directdownloadlink =
$object->getLastMainDocLink(
'expedition');
1098 if (preg_match(
'/\.pdf/i', $last_main_doc_file)) {
1099 $ref_pdf = pathinfo($last_main_doc_file, PATHINFO_FILENAME);
1101 $newpdffilename = $upload_dir . $ref_pdf .
"_signed-" . $date .
".pdf";
1102 $sourcefile = $upload_dir . $ref_pdf .
".pdf";
1105 $parameters = array(
'sourcefile' => $sourcefile,
'newpdffilename' => $newpdffilename);
1106 $reshook = $hookmanager->executeHooks(
'AddSignature', $parameters,
$object, $action);
1108 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
1111 if (empty($reshook)) {
1114 if (class_exists(
'TCPDF')) {
1115 $pdf->setPrintHeader(
false);
1116 $pdf->setPrintFooter(
false);
1121 $pdf->SetCompression(
false);
1125 $pagecount = $pdf->setSourceFile($sourcefile);
1128 $param[
'online_sign_name'] = $online_sign_name;
1129 $param[
'pathtoimage'] = $upload_dir . $filename;
1132 for ($i = 1; $i < ($pagecount + 1); $i++) {
1134 $tppl = $pdf->importPage($i);
1135 $s = $pdf->getTemplatesize($tppl);
1136 $pdf->AddPage($s[
'h'] > $s[
'w'] ?
'P' :
'L');
1137 $pdf->useTemplate($tppl);
1143 $param[
'xforimgstart'] = (empty($s[
'w']) ? 110 : round($s[
'w'] * 0.53));
1144 $param[
'yforimgstart'] = (empty($s[
'h']) ? 250 : $s[
'h'] - 60);
1145 $param[
'wforimg'] = $s[
'w'] - ($param[
'xforimgstart'] + 16);
1150 dol_syslog(
"Error when manipulating some PDF by onlineSign: " . $e->getMessage(), LOG_ERR);
1151 $response = $e->getMessage();
1160 $param[
'xforimgstart'] = (empty($s[
'w']) ? 110 : round($s[
'w'] * 0.53));
1161 $param[
'yforimgstart'] = (empty($s[
'h']) ? 250 : $s[
'h'] - 60);
1162 $param[
'wforimg'] = $s[
'w'] - ($param[
'xforimgstart'] + 16);
1168 $pdf->Output($newpdffilename,
"F");
1171 $object->indexFile($newpdffilename, 1);
1175 $response =
"success";
1177 } elseif (preg_match(
'/\.odt/i', $last_main_doc_file)) {
1185 $user =
new User($db);
1186 $object->setSignedStatus($user, Expedition::$SIGNED_STATUSES[
'STATUS_SIGNED_RECEIVER_ONLINE'], 0,
'SHIPPING_MODIFY');
1190 $response =
'error signature_not_found';
1195 http_response_code(501);
1213 $xforimgstart = $params[
'xforimgstart'];
1214 $yforimgstart = $params[
'yforimgstart'];
1215 $wforimg = $params[
'wforimg'];
1217 $pdf->SetXY($xforimgstart, $yforimgstart + round($wforimg / 4) - 4);
1218 $pdf->SetFont($default_font,
'', $default_font_size - 1);
1219 $pdf->SetTextColor(80, 80, 80);
1220 $pdf->MultiCell($wforimg, 4, $langs->transnoentities(
"Signature") .
': ' .
dol_print_date(
dol_now(),
"day",
false, $langs,
true).
' - '.$params[
'online_sign_name'], 0,
'L');
1224 $pdf->Image($params[
'pathtoimage'], $xforimgstart, $yforimgstart, $wforimg, round($wforimg / 4));
if(! $sortfield) if(! $sortorder) $object
Class to manage customers orders.
Class to manage bank accounts description of third parties.
Class to manage proposals.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
dol_get_first_hour($date, $gm='tzserver')
Return GMT time for first hour of a given GMT date (it removes hours, min and second part)
dol_is_writable($folderorfile)
Test if directory or filename is writable.
dol_is_file($pathoffile)
Return if path is a file.
dol_is_dir($folder)
Test if filename is a directory.
dol_now($mode='gmt')
Return date for now.
dol_ucfirst($string, $encoding="UTF-8")
Convert first character of the first word of a string to upper.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
dolChmod($filepath, $newmask='')
Change mod of a file.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
getUserRemoteIP($trusted=0)
Return the real IP of remote user.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
if(!defined( 'NOREQUIREMENU')) if(!empty(GETPOST('seteventmessages', 'alpha'))) if(!function_exists("llxHeader")) top_httphead($contenttype='text/html', $forcenocache=0)
Show HTTP header.
dolPrintSignatureImage(TCPDF $pdf, $langs, $params)
Output the signature file into the PDF object.
pdf_getFormat($outputlangs=null, $mode='setup')
Return array with format properties of default PDF format.
pdf_getPDFFontSize($outputlangs)
Return font size to use for PDF generation.
pdfExtractMetadata($file, $field='Keywords')
Function to extract metadata from a PDF file by doing a binary parsing of the PDF file.
pdf_getPDFFont($outputlangs)
Return font name to use for PDF generation.
pdf_getInstance($format='', $metric='mm', $pagetype='P')
Return a PDF instance object.
httponly_accessforbidden($message='1', $http_response_code=403, $stringalreadysanitized=0)
Show a message to say access is forbidden and stop program.
dol_hash($chain, $type='0', $nosalt=0, $mode=0)
Returns a hash (non reversible encryption) of a string.
dol_verifyHash($chain, $hash, $type='0')
Compute a hash and compare it to the given one For backward compatibility reasons,...