[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Noalyss-commit] [noalyss] 22/29: Task #0002318: Envoi email : forcer le
From: |
dwm |
Subject: |
[Noalyss-commit] [noalyss] 22/29: Task #0002318: Envoi email : forcer le domaine de l'expéditeur Adapter le fichier config |
Date: |
Sat, 6 Jan 2024 05:59:16 -0500 (EST) |
sparkyx pushed a commit to branch devel
in repository noalyss.
commit cafeec15f58f69572e71797860903f7fed930c4d
Author: sparkyx <danydb@noalyss.eu>
AuthorDate: Tue Dec 26 11:25:35 2023 +0100
Task #0002318: Envoi email : forcer le domaine de l'expéditeur
Adapter le fichier config
---
include/class/sendmail.class.php | 40 ++++-
include/config.inc.example | 5 +-
include/lib/config_file.php | 276 +++++++++++++++++--------------
include/lib/sendmail_core.class.php | 4 +-
unit-test/include/class/sendmailTest.php | 187 +++++++++++++++++++++
5 files changed, 386 insertions(+), 126 deletions(-)
diff --git a/include/class/sendmail.class.php b/include/class/sendmail.class.php
index d8cc8567d..006298fb4 100644
--- a/include/class/sendmail.class.php
+++ b/include/class/sendmail.class.php
@@ -96,6 +96,7 @@ class Sendmail extends Sendmail_Core
{
$max_email = $p_repo->get_value("select dos_email from ac_dossier
where dos_id=$1",
array($p_dossier_id));
+ if ($max_email == "") return 0;
return $max_email;
}
/**
@@ -114,6 +115,43 @@ class Sendmail extends Sendmail_Core
}
+
+ /**
+ * @brief check if there is a mandatory domain, if yes
+ * @return void
+ * @throws Exception
+ */
+ function verify()
+ {
+ try {
+ parent::verify();
+ } catch (\Exception $e) {
+ throw $e;
+ }
+ if ( defined('ALLOWED_EMAIL_DOMAIN') )
+ {
+ if ( ALLOWED_EMAIL_DOMAIN != "")
+ {
+ $as_domain=explode(",", ALLOWED_EMAIL_DOMAIN);
+ $valid=0;
+ foreach ($as_domain as $domain) {
+ $domain="@$domain";
+ if (strpos($this->from,$domain) != 0 ) {
+ $valid=1;
+ break;
+ }
+ }
+ if ( $valid == 0) {
+ throw new Exception("Domaine email {$this->from}
interdit",EXC_INVALID);
+
+ }
+
+ }
+
+ }
+
+ }
+
/**
* @brief Add $p_amount_email to email sent
* @param $p_repo Database
@@ -124,7 +162,7 @@ class Sendmail extends Sendmail_Core
{
if ( $p_dossier == -1) return ;
$email_sent = $this->get_email_sent($p_repo,$p_dossier,$p_date);
- if ( empty($email_sent) ){
+ if ( $email_sent == 0 ){
$p_repo->exec_sql("insert into
public.dossier_sent_email(de_sent_email,dos_id,de_date) values($1,$2,$3)",
array(1,$p_dossier,$p_date));
return;
diff --git a/include/config.inc.example b/include/config.inc.example
index 114108b1b..f98304544 100644
--- a/include/config.inc.example
+++ b/include/config.inc.example
@@ -88,4 +88,7 @@ define ("DEBUGNOALYSS",0);
// define ("AUDIT_ENABLE",true);
//
// display a captcha
-// define ("NOALYSS_CAPTCHA",true);
\ No newline at end of file
+// define ("NOALYSS_CAPTCHA",true);
+// When sending an email , the domain of this email must be in comma separated
list ,
+// if the list is an empty string then all the domain are allowed
+// define ('ALLOWED_EMAIL_DOMAIN','');
\ No newline at end of file
diff --git a/include/lib/config_file.php b/include/lib/config_file.php
index b3d8a9d42..19eee50fc 100644
--- a/include/lib/config_file.php
+++ b/include/lib/config_file.php
@@ -19,7 +19,8 @@
// Copyright Author Dany De Bontridder danydb@aevalys.eu
-/*!\file
+/*!
+ \file
* \brief functions concerning the config file config.inc.php. The domain is
not set into the form for security issues
*/
@@ -40,7 +41,8 @@ function is_unix()
}
-/*!\brief
+/*
+ * !\brief
*\param array with the index
* - ctmp temporary folder
* - cpath path to postgresql
@@ -112,63 +114,60 @@ function config_file_form($p_array=null)
require NOALYSS_TEMPLATE.'/template_config_form.php';
}
/**
- * Display the content of the config.inc.php with variables
+ * @brief Display the content of the config.inc.php with variables
* @param type $p_array
* @param type $from_setup
* @param type $p_os
*/
-function display_file_config($p_array,$from_setup=1,$p_os=1)
+function display_file_config($p_array, $from_setup = 1, $p_os = 1)
{
extract($p_array, EXTR_SKIP);
print ('<?php ');
- print ("\r\n");
- print ( 'date_default_timezone_set (\'Europe/Brussels\');');
- print ("\r\n");
- print ( "\$_ENV['TMP']='".$ctmp."';");
- print ("\r\n");
- print ( 'define("PG_PATH","'.$cpath.'");');
- print ("\r\n");
- if ( $p_os == 1 )
- {
- print ( 'define("PG_RESTORE","'.$cpath.DIRECTORY_SEPARATOR.'pg_restore
");');
- print ("\r\n");
- print ( 'define("PG_DUMP","'.$cpath.DIRECTORY_SEPARATOR.'pg_dump ");');
- print ("\r\n");
- print ( 'define ("PSQL","'.$cpath.DIRECTORY_SEPARATOR.'psql");');
- }
- else
- {
- print ( 'define("PG_RESTORE","pg_restore.exe");');
- print ("\r\n");
- print ( 'define("PG_DUMP","pg_dump.exe");');
- print ("\r\n");
- print ( 'define ("PSQL","psql.exe");');
+ echo PHP_EOL;
+ print ('date_default_timezone_set (\'Europe/Brussels\');');
+ echo PHP_EOL;
+ print ("\$_ENV['TMP']='" . $ctmp . "';");
+ echo PHP_EOL;
+ print ('define("PG_PATH","' . $cpath . '");');
+ echo PHP_EOL;
+ if ($p_os == 1) {
+ print ('define("PG_RESTORE","' . $cpath . DIRECTORY_SEPARATOR .
'pg_restore ");');
+ echo PHP_EOL;
+ print ('define("PG_DUMP","' . $cpath . DIRECTORY_SEPARATOR . 'pg_dump
");');
+ echo PHP_EOL;
+ print ('define ("PSQL","' . $cpath . DIRECTORY_SEPARATOR . 'psql");');
+ } else {
+ print ('define("PG_RESTORE","pg_restore.exe");');
+ echo PHP_EOL;
+ print ('define("PG_DUMP","pg_dump.exe");');
+ echo PHP_EOL;
+ print ('define ("PSQL","psql.exe");');
}
- print ("\r\n");
- print ( 'define ("noalyss_user","'.$cuser.'");');
- print ("\r\n");
- print ( 'define ("noalyss_password","'.$cpasswd.'");');
- print ("\r\n");
- print ( 'define ("noalyss_psql_port","'.$cport.'");');
- print ("\r\n");
- print ( 'define ("noalyss_psql_host","'.$chost.'");');
- print ("\r\n");
- print ("\r\n");
+ echo PHP_EOL;
+ print ('define ("noalyss_user","' . $cuser . '");');
+ echo PHP_EOL;
+ print ('define ("noalyss_password","' . $cpasswd . '");');
+ echo PHP_EOL;
+ print ('define ("noalyss_psql_port","' . $cport . '");');
+ echo PHP_EOL;
+ print ('define ("noalyss_psql_host","' . $chost . '");');
+ echo PHP_EOL;
+ echo PHP_EOL;
print ("// If you change the NOALYSS_ADMINISTRATOR , you will need to
rerun http://..../noalyss/html/install.php");
- print ("\r\n");
+ echo PHP_EOL;
print ("// But it doesn't change the password");
- print ("\r\n");
- print ( 'define ("NOALYSS_ADMINISTRATOR","'.$cadmin.'");');
- print ("\r\n");
+ echo PHP_EOL;
+ print ('define ("NOALYSS_ADMINISTRATOR","' . $cadmin . '");');
+ echo PHP_EOL;
print ("// For changing the password of admin, go to preference or update
in db");
- print ("\r\n");
+ echo PHP_EOL;
print ("// this password is only used when executing install.php ");
- print ("\r\n");
- print ( 'define ("NOALYSS_ADMIN_PASSWORD","'.$cpassword_admin.'");');
- print ("\r\n");
-
- print ( 'define ("LOCALE",'.$clocale.');');
- print ("\r\n");
+ echo PHP_EOL;
+ print ('define ("NOALYSS_ADMIN_PASSWORD","' . $cpassword_admin . '");');
+ echo PHP_EOL;
+
+ print ('define ("LOCALE",' . $clocale . ');');
+ echo PHP_EOL;
echo "
/*
* DEBUGNOALYSS let you see more information when you develop.
@@ -176,92 +175,125 @@ function
display_file_config($p_array,$from_setup=1,$p_os=1)
* 1 = display all errors
* 2 = display all errors + more information
*/
-";
-
- print ("\r\n");
- print ( 'define ("DEBUGNOALYSS",0);');
- print ("\r\n");
-
- print ( 'define ("domaine","");');
- print ("\r\n");
- if (isset($multi))
- {
- print ( 'define ("MULTI",0);');
+";
+
+ echo PHP_EOL;
+ print ('define ("DEBUGNOALYSS",0);');
+ echo PHP_EOL;
+
+ print ('define ("domaine","");');
+ echo PHP_EOL;
+ if (isset($multi)) {
+ print ('define ("MULTI",0);');
}
- if (!isset($multi))
- {
- print ( 'define ("MULTI",1);');
+ if (!isset($multi)) {
+ print ('define ("MULTI",1);');
}
- print ("\r\n");
- print ( 'define ("dbname","'.$cdbname.'");');
- print ("\r\n");
-
+ echo PHP_EOL;
+ print ('define ("dbname","' . $cdbname . '");');
+ echo PHP_EOL;
+
print (' // Uncomment to log your input');
- print ("\r\n");
- print ( '// define ("LOGINPUT",TRUE);');
- print ("\r\n");
- print ("\r\n");
- print ("\r\n");
+ echo PHP_EOL;
+ print ('// define ("LOGINPUT",TRUE);');
+ echo PHP_EOL;
+ echo PHP_EOL;
+ echo PHP_EOL;
print (' // Do not change below !!!');
- print ("\r\n");
+ echo PHP_EOL;
print (' // These variable are computed but could be changed in ');
- print ("\r\n");
+ echo PHP_EOL;
print (' // very special configuration');
- print ("\r\n");
- print ( '// define ("NOALYSS_HOME","");');
- print ("\r\n");
- print ( '// define ("NOALYSS_PLUGIN","");');
- print ("\r\n");
- print ( '// define ("NOALYSS_INCLUDE","");');
- print ("\r\n");
- print ( '// define ("NOALYSS_TEMPLATE","");');
- print ("\r\n");
- print ( '// define ("NOALYSS_INCLUDE","");');
- print ("\r\n");
- print ( '// define ("NOALYSS_TEMPLATE","");');
- print ("\r\n");
- print ( "// Fix an issue with PDF when exporting receipt in PDF in
ANCGL"."\r\n");
- print ( '// define ("FIX_BROKEN_PDF","NO");');
- print ("\r\n");
+ echo PHP_EOL;
+ print ('// define ("NOALYSS_HOME","");');
+ echo PHP_EOL;
+ print ('// define ("NOALYSS_PLUGIN","");');
+ echo PHP_EOL;
+ print ('// define ("NOALYSS_INCLUDE","");');
+ echo PHP_EOL;
+ print ('// define ("NOALYSS_TEMPLATE","");');
+ echo PHP_EOL;
+ print ('// define ("NOALYSS_INCLUDE","");');
+ echo PHP_EOL;
+ print ('// define ("NOALYSS_TEMPLATE","");');
+ echo PHP_EOL;
+ print ("// Fix an issue with PDF when exporting receipt in PDF in ANCGL");
+ print ('// define ("FIX_BROKEN_PDF","NO");');
+ echo PHP_EOL;
print ("// Uncomment if you want to convert to PDF");
- print ("\r\n");
+ echo PHP_EOL;
print ("// With the unoconv tool");
- print ("\r\n");
- print ( "//define ('OFFICE','HOME=/tmp unoconv ');");
- print ("\r\n");
+ echo PHP_EOL;
+ print ("//define ('OFFICE','HOME=/tmp unoconv ');");
+ echo PHP_EOL;
print ("//define ('GENERATE_PDF','YES');");
- print ("\r\n");
- print ( "// Uncomment if you don't want "."\r\n");
- print ( "// to be informed when a new release is "."\r\n");
- print ( "// published"."\r\n");
- print ( '// define ("SITE_UPDATE","");'."\r\n");
- print ( '// define ("SITE_UPDATE_PLUGIN","");'."\r\n");
- print ( '// To allow to access the Info system'."\r\n");
- print ( '// define ("SYSINFO_DISPLAY",true);'."\r\n");
- print ( '// For developpement'."\r\n");
- print ( '// define ("NOALYSS VERSION",9999);'."\r\n");
- print (' // If you want to override the parameters you have to define
OVERRIDE_PARAM'."\r\n");
- print ('// and give your own parameters for max_execution_time and
memory_limit'."\r\n");
- print ("// define ('OVERRIDE_PARAM',1);\r\n");
- print ("// ini_set ('max_execution_time',240);\r\n");
- print ("// ini_set ('memory_limit','256M');\r\n");
- print ("// In recent distribution linux, pdftk is a snap, you should set
the path\r\n");
- print ("// for exporting document in PDF\r\n");
- print ("// \$pdftk = /usr/bin/pdftk \r\n");
- print ("// \$pdftk = /snap/bin/pdftk \r\n");
- print ("// uncomment to activate the captcha on login page\r\n");
- print ("// define('NOALYSS_CAPTCHA',true);\r\n");
- print ("// Uncomment if you want to activate the possibility to
reinitialize;\r\n");
- print ("// password by email\r\n");
- print ("// define ('RECOVER','1');\r\n");
- print ("// Uncomment and define if you want to Name of the sender of the
email \r\n");
- print ("// if you activate the possibility to reinitialize password by
email\r\n");
- print ("// define('ADMIN_WEB', 'www-data@localhost');\r\n");
- print ("// Define a random session key if you work with different version
of NOALYSS\r\n");
- printf ("define ('SESSION_KEY','%s');",generate_random_string(10)) ;
+ echo PHP_EOL;
+ print ("// Uncomment if you don't want ");
+ echo PHP_EOL;
+ print ("// to be informed when a new release is ");
+ echo PHP_EOL;
+ print ("// published");
+ echo PHP_EOL;
+ print ('// define ("SITE_UPDATE","");');
+ echo PHP_EOL;
+ print ('// define ("SITE_UPDATE_PLUGIN","");');
+ echo PHP_EOL;
+ print ('// To allow to access the Info system');
+ echo PHP_EOL;
+ print ('// define ("SYSINFO_DISPLAY",true);');
+ echo PHP_EOL;
+ print ('// For developpement');
+ echo PHP_EOL;
+ print ('// define ("NOALYSS VERSION",9999);');
+ echo PHP_EOL;
+ print (' // If you want to override the parameters you have to define
OVERRIDE_PARAM');
+ echo PHP_EOL;
+ print ('// and give your own parameters for max_execution_time and
memory_limit');
+ echo PHP_EOL;
+ print ("// define ('OVERRIDE_PARAM',1);");
+ echo PHP_EOL;
+ print ("// ini_set ('max_execution_time',240);");
+ echo PHP_EOL;
+ print ("// ini_set ('memory_limit','256M');");
+ echo PHP_EOL;
+ print ("// In recent distribution linux, pdftk is a snap, you should set
the path");
+ echo PHP_EOL;
+ print ("// for exporting document in PDF");
+ echo PHP_EOL;
+ print ("// \$pdftk = /usr/bin/pdftk ");
+ echo PHP_EOL;
+ print ("// \$pdftk = /snap/bin/pdftk ");
+ echo PHP_EOL;
+ print ("// uncomment to activate the captcha on login page");
+ echo PHP_EOL;
+ print ("// define('NOALYSS_CAPTCHA',true);");
+ echo PHP_EOL;
+ print ("// Uncomment if you want to activate the possibility to
reinitialize;");
+ echo PHP_EOL;
+ print ("// password by email");
+ echo PHP_EOL;
+ print ("// define ('RECOVER','1');");
+ echo PHP_EOL;
+ print ("// Uncomment and define if you want to Name of the sender of the
email ");
+ echo PHP_EOL;
+ print ("// if you activate the possibility to reinitialize password by
email");
+ echo PHP_EOL;
+ print ("// define('ADMIN_WEB', 'www-data@localhost');");
+ echo PHP_EOL;
+ print ("// Define a random session key if you work with different version
of NOALYSS");
+ echo PHP_EOL;
+ printf("define ('SESSION_KEY','%s');", generate_random_string(10));
+ echo PHP_EOL;
+ printf("// When sending an email , the domain of this email must be in
comma separated list ,");
+ echo PHP_EOL;
+ print ("// if the list is an empty string then all the domain are
allowed");
+ echo PHP_EOL;
+ printf("// define ('ALLOWED_EMAIL_DOMAIN','');");
+ echo PHP_EOL;
}
-/*!\brief create the config file
+/*!
+ * \brief create the config file
*/
function config_file_create($p_array,$from_setup,$p_os=1)
{
diff --git a/include/lib/sendmail_core.class.php
b/include/lib/sendmail_core.class.php
index f07648bc8..4620adbde 100644
--- a/include/lib/sendmail_core.class.php
+++ b/include/lib/sendmail_core.class.php
@@ -106,9 +106,9 @@ class Sendmail_Core
for ($i = 0; $i < count($array); $i++)
{
$name = $array[$i];
- if (trim($this->$name) == "")
+ if (trim($this->$name??"") == "")
{
- throw new Exception( sprintf(_("%s est vide"),$name));
+ throw new Exception( sprintf(_("%s est
vide"),$name),EXC_INVALID);
}
}
}
diff --git a/unit-test/include/class/sendmailTest.php
b/unit-test/include/class/sendmailTest.php
new file mode 100644
index 000000000..1b327c82f
--- /dev/null
+++ b/unit-test/include/class/sendmailTest.php
@@ -0,0 +1,187 @@
+<?php
+
+/*
+ * * Copyright (C) 2022 Dany De Bontridder <dany@alchimerys.be>
+ *
+ * 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 2
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ *
+ * Author : Dany De Bontridder danydb@noalyss.eu $(DATE)
+ */
+
+/**
+ * @file
+ * @brief noalyss
+ */
+
+use PHPUnit\Framework\TestCase;
+
+require DIRTEST . '/global.php';
+
+define ("ALLOWED_EMAIL_DOMAIN","linux.org,localhost");
+
+/**
+ * @testdox Class SendmailTest : used for ...
+ * @backupGlobals enabled
+ * @coversDefaultClass Sendmail
+ */
+class SendmailTest extends TestCase
+{
+
+ /**
+ * @testdox verify that email has the mandatory filed
+ * @covers Sendmail::verify
+ * @backupGlobals enabled
+ */
+ function testVerifyCorrect()
+ {
+ $sendmail=new \Sendmail();
+ $sendmail->mailto("dany@gmail.com");
+ $sendmail->set_from("web@localhost");
+ $sendmail->set_subject("Test envoi");
+ $sendmail->set_message("corps du message");
+ try {
+ $sendmail->verify();
+ $this->assertTrue(true);
+ } catch (\Exception $e) {
+ $this->assertTrue(false," check email fails");
+ }
+
+ }
+ /**
+ * @testdox verify that email fails it mailto is absent
+ * @covers Sendmail::verify
+ * @backupGlobals enabled
+ */
+ function testVerifyFailsMailto()
+ {
+ $sendmail=new \Sendmail();
+ $sendmail->mailto("");
+ $sendmail->set_from("web@localhost");
+ $sendmail->set_subject("Test envoi");
+ $sendmail->set_message("corps du message");
+ $this->expectExceptionCode(EXC_INVALID);
+ $sendmail->verify();
+
+ }
+ /**
+ * @testdox verify that email fails it recipient is absent
+ * @covers Sendmail::verify
+ * @backupGlobals enabled
+ */
+ function testVerifyFailsFrom()
+ {
+ $sendmail=new \Sendmail();
+ $sendmail->mailto("web@localhost");
+ $sendmail->set_from("");
+ $sendmail->set_subject("Test envoi");
+ $sendmail->set_message("corps du message");
+ $this->expectExceptionCode(EXC_INVALID);
+ $sendmail->verify();
+
+ }
+ /**
+ * @testdox verify that email fails it subject is absent
+ * @covers Sendmail::verify
+ * @backupGlobals enabled
+ */
+ function testVerifyFailsSubject()
+ {
+ $sendmail=new \Sendmail();
+ $sendmail->mailto("web@localhost");
+ $sendmail->set_from("dany@gmail.com");
+ $sendmail->set_message("corps du message");
+ $this->expectExceptionCode(EXC_INVALID);
+ $sendmail->verify();
+
+ }
+ /**
+ * @testdox verify that email fails it content is absent
+ * @covers Sendmail::verify
+ * @backupGlobals enabled
+ */
+ function testVerifyFailsContent()
+ {
+ $sendmail=new \Sendmail();
+ $sendmail->mailto("");
+ $sendmail->set_from("web@localhost");
+ $sendmail->set_subject("Test envoi");
+ $this->expectExceptionCode(EXC_INVALID);
+ $sendmail->verify();
+
+ }
+ /**
+ * @testdox Check that the from of email respect Domain : domain allowed
+ * @covers Sendmail::verify
+ * @backupGlobals enabled
+ */
+ function testVerifyDomainFails()
+ {
+ $sendmail=new \Sendmail();
+ $sendmail->mailto("web@localhost");
+ $sendmail->set_from("dany@gmail.com");
+ $sendmail->set_subject("Test envoi");
+ $sendmail->set_message("corps du message");
+
+ $this->expectExceptionCode(EXC_INVALID);
+ $sendmail->verify();
+
+ }
+ /**
+ * @testdox Check that the from of email respect Domain : domain forbidden
+ * @covers Sendmail::verify
+ * @backupGlobals enabled
+ */
+ function testVerifyDomainSuccess()
+ {
+ $sendmail=new \Sendmail();
+ $sendmail->mailto("web@localhost");
+ $sendmail->set_from("dany@linux.org");
+ $sendmail->set_subject("Test envoi");
+ $sendmail->set_message("corps du message");
+
+ $sendmail->verify();
+ $this->assertTrue(true);
+
+ }
+ /*
+ *@testdox test increment email
+ *@covers Sendmail::increment_mail Sendmail::get_email_sent
+ */
+ function testIncrement_mail()
+ {
+ $cn=new \Database();
+ $dos_id=DOSSIER;
+ $sendmail=new Sendmail();
+ $cn->exec_sql("delete from dossier_sent_email where dos_id=$dos_id and
de_date='20100101'");
+ $email_sent=$sendmail->get_email_sent($cn, $dos_id, '20100101');
+ $this->assertTrue($email_sent == 0,"error cannot count email get
$email_sent");
+
+ $sendmail->increment_mail($cn, $dos_id, "20100101");
+ $email_sent=$sendmail->get_email_sent($cn, $dos_id, '20100101');
+ $this->assertTrue($email_sent == 1,"error cannot count email get
$email_sent");
+
+ $sendmail->increment_mail($cn, $dos_id, "20100101");
+ $email_sent=$sendmail->get_email_sent($cn, $dos_id, '20100101');
+ $this->assertTrue($email_sent == 2,"error cannot count email");
+
+ $sendmail->increment_mail($cn, $dos_id, "20100101");
+ $email_sent=$sendmail->get_email_sent($cn, $dos_id, '20100101');
+ $this->assertTrue($email_sent == 3,"error cannot count email
$email_sent");
+
+ $cn->exec_sql("delete from dossier_sent_email where dos_id=$dos_id and
de_date='20100101'");
+
+ }
+}
\ No newline at end of file
- [Noalyss-commit] [noalyss] 11/29: PHP8.1 Compatibility, (continued)
- [Noalyss-commit] [noalyss] 11/29: PHP8.1 Compatibility, dwm, 2024/01/06
- [Noalyss-commit] [noalyss] 13/29: Code improve : Acc_Balance utilise PDF_CORE::is_fill, dwm, 2024/01/06
- [Noalyss-commit] [noalyss] 14/29: Improve Code : permet d'avoir plusieurs couleurs sur une ligne, dwm, 2024/01/06
- [Noalyss-commit] [noalyss] 17/29: Improve : PRINTJRN search in detail VAT mode, dwm, 2024/01/06
- [Noalyss-commit] [noalyss] 18/29: PHP8.1 Compatibility, dwm, 2024/01/06
- [Noalyss-commit] [noalyss] 21/29: PhpUnit : test, dwm, 2024/01/06
- [Noalyss-commit] [noalyss] 20/29: Bug fix : sent emails not counted properly, dwm, 2024/01/06
- [Noalyss-commit] [noalyss] 23/29: Task #1749: Cases «Débit» dans les OD's fait remarquer si débit ou crédit, dwm, 2024/01/06
- [Noalyss-commit] [noalyss] 04/29: cosmetic info password, dwm, 2024/01/06
- [Noalyss-commit] [noalyss] 12/29: Fix bug : $g_parameter non initialisé pour plugin, dwm, 2024/01/06
- [Noalyss-commit] [noalyss] 22/29: Task #0002318: Envoi email : forcer le domaine de l'expéditeur Adapter le fichier config,
dwm <=
- [Noalyss-commit] [noalyss] 24/29: Task #1749: Cases «Débit» dans les OD's fait remarquer si débit ou crédit, dwm, 2024/01/06
- [Noalyss-commit] [noalyss] 15/29: TFPDF mise à jour 1.33, dwm, 2024/01/06
- [Noalyss-commit] [noalyss] 27/29: fixup! fixup! Task #1749: Cases «Débit» dans les OD's fait remarquer si débit ou crédit, dwm, 2024/01/06
- [Noalyss-commit] [noalyss] 29/29: Cosmetic Totaux OD, dwm, 2024/01/06
- [Noalyss-commit] [noalyss] 16/29: Improve : PRINTJRN search in one line mode, dwm, 2024/01/06
- [Noalyss-commit] [noalyss] 19/29: 0002317: Paiement : forcer la fiche pour les banques, dwm, 2024/01/06
- [Noalyss-commit] [noalyss] 25/29: fixup! Task #1749: Cases «Débit» dans les OD's fait remarquer si débit ou crédit, dwm, 2024/01/06
- [Noalyss-commit] [noalyss] 26/29: fixup! fixup! Task #1749: Cases «Débit» dans les OD's fait remarquer si débit ou crédit, dwm, 2024/01/06
- [Noalyss-commit] [noalyss] 28/29: Task #0002219 PHP 8.1 Compatibility, dwm, 2024/01/06