Limit email by folder

This commit is contained in:
Dany De Bontridder 2016-04-19 13:31:27 +02:00
parent c857e967fa
commit a7ba936a72
6 changed files with 147 additions and 12 deletions

View file

@ -209,6 +209,13 @@ if (in_array($op, array('modele_drop', 'modele_modify', 'folder_modify', 'folder
echo _('Description').' : <br>';
echo $wDesc->input('desc', $dos->get_parameter('desc'));
echo '<br>';
echo _('Max. email / jour (-1 = illimité)') ;
$max_email_input=new INum('max_email');
$max_email_input->value=$dos->get_parameter('max_email');
$max_email_input->prec=0;
echo $max_email_input->input();
echo '<br>';
echo HtmlInput::submit('upd', _('Modifie'));
echo '</form>';
$content=ob_get_clean();

View file

@ -43,7 +43,8 @@ class Dossier
private static $variable=array("id"=>"dos_id",
"name"=>"dos_name",
"desc"=>"dos_description");
"desc"=>"dos_description",
"max_email"=>'dos_email');
function __construct($p_id)
{
@ -176,7 +177,9 @@ class Dossier
exit('gDossier Invalide : '.$id);
}
/*!\brief return a string to put to gDossier into a GET */
/*!
* \brief return a string to put to gDossier into a GET
*/
static function get()
{
@ -247,12 +250,13 @@ class Dossier
array($this->dos_name, $this->dos_id))!=0)
return;
$sql="update ac_dossier set dos_name=$1,dos_description=$2 ".
" where dos_id = $3";
$sql="update ac_dossier set dos_name=$1,dos_description=$2 ,dos_email=$3".
" where dos_id = $4";
$res=$this->cn->exec_sql(
$sql,
array(trim($this->dos_name),
trim($this->dos_description),
$this->dos_email,
$this->dos_id)
);
}
@ -260,7 +264,7 @@ class Dossier
public function load()
{
$sql="select dos_name,dos_description from ac_dossier where dos_id=$1";
$sql="select dos_name,dos_description,dos_email from ac_dossier where dos_id=$1";
$res=$this->cn->exec_sql(
$sql, array($this->dos_id)

View file

@ -106,7 +106,7 @@ if ( ! defined ("SYSINFO_DISPLAY")) {
}
define ("DBVERSION",125);
define ("MONO_DATABASE",25);
define ("DBVERSIONREPO",16);
define ("DBVERSIONREPO",17);
define ('NOTFOUND','--not found--');
define ("MAX_COMPTE",4);
define ('MAX_ARTICLE',5);
@ -296,4 +296,9 @@ define ("SQL_LIST_UNPAID_INVOICE_DATE_LIMIT" ,"
where (jr_rapt is null or jr_rapt = '')
and to_date(to_char(jr_ech,'DD.MM.YYYY'),'DD.MM.YYYY') < to_date(to_char(now(),'DD.MM.YYYY'),'DD.MM.YYYY')
and jr_valid = true" );
?>
/**
* Exception
*/
// Limit email exceeds parameter
define ('EMAIL_LIMIT',1002);

View file

@ -38,8 +38,10 @@ if ( isset ($_POST['upd']) && isNumber($dossier_id) == 1 && $dossier_id != -1)
$dos=new dossier($dossier_id);
$name=HtmlInput::default_value_post('name', "--vide--");
$desc=HtmlInput::default_value_post('desc', "--vide--");
$max_email=HtmlInput::default_value_post("max_email", -1);
$dos->set_parameter('name',$name);
$dos->set_parameter('desc',$desc);
$dos->set_parameter("max_email", $max_email);
$dos->save();
}
echo '<div class="content" style="width:80%;margin-left:10%">';
@ -89,12 +91,13 @@ if ( isset ($_POST["DATABASE"]) )
* Insert new dossier with description
*/
$desc=HtmlInput::default_value_post("DESCRIPTION","");
$max_email=HtmlInput::default_value_post("max_email", -1);
try
{
$repo->start();
$Res=$repo->exec_sql("insert into ac_dossier(dos_name,dos_description)
values ($1,$2)",array($dos,$desc));
$Res=$repo->exec_sql("insert into ac_dossier(dos_name,dos_description,dos_email)
values ($1,$2)",array($dos,$desc,$max_email));
$l_id=$repo->get_current_seq('dossier_id');
$repo->commit();
}
@ -334,6 +337,18 @@ if ( $sa == 'list' )
<TD><?php echo _('Description');
?></td><td> <TEXTAREA class="input_text" COLS="60" ROWS="2" NAME="DESCRIPTION" ></TEXTAREA> </TD>
</TR>
<tr>
<td>
<?php echo _('Max. email / jour (-1 = illimité)') ;?>
</td>
<td>
<?php
$max_email_input=new INum('max_email');
$max_email_input->prec=0;
echo $max_email_input->input();
?>
</td>
</tr>
<TR> <TD><?php echo _('Modèle');
?></td><td> <?php echo $template;
?> </TD></TR>

View file

@ -93,7 +93,7 @@ class Sendmail
$name = $array[$i];
if (trim($this->$name) == "")
{
throw new Exception($name ._(" est vide"));
throw new Exception( sprintf(_("%s est vide",$name)));
}
}
}
@ -149,11 +149,95 @@ class Sendmail
*/
function send()
{
if ( $this->can_send() == false ) throw new Exception(_('Email non envoyé'),EMAIL_LIMIT);
//SEND Mail
if (!mail($this->mailto, $this->subject, "", $this->content))
{
throw new Exception('send failed');
}
// Increment email amount
$repo =new Database();
$date=date('Ymd');
$dossier=Dossier::id();
$this->increment_mail($repo,$dossier,$date);
}
/**
* Check if email can be sent from a folder
* @return boolean
*/
function can_send() {
/**
* if send from a dossier , then check limit of this dossier
* otherwise send true
*/
$dossier=HtmlInput::default_value_request("gDossier", -1);
if ($dossier == -1 ) return true;
/**
* Compare max value in repo
*/
$repo =new Database();
$date=date('Ymd');
// get max email
$max_email = $this->get_max_email($repo,$dossier);
//
// This folder cannot send email
if ($max_email == 0 ) return false;
//
// This folder has unlimited email
if ($max_email == -1 ) return true;
// get email sent today from account_repository
$email_sent = $this->get_email_sent($repo,$dossier , $date);
//
if ( $email_sent >= $max_email) return false;
return true;
}
/**
* return max email the folder can send
* @param $p_repo Database
* @param $p_dossier_id int
*/
function get_max_email(Database $p_repo,$p_dossier_id)
{
$max_email = $p_repo->get_value("select dos_email from ac_dossier where dos_id=$1",
array($p_dossier_id));
return $max_email;
}
/**
* Return the amount of send emails for the date (YYYYMMDD)
* @param Database $p_repo
* @param $p_dossier_id int
* @param $p_date string YYYYMMDD
*/
function get_email_sent(Database $p_repo,$p_dossier_id,$p_date)
{
$email_sent = $p_repo->get_value ('select de_sent_email from dossier_sent_email where dos_id = $1 and de_date=$2',
array($p_dossier_id,$p_date));
return $email_sent;
}
/**
* Add $p_amount_email to email sent
* @param $p_repo Database
* @param $p_dossier int id of the folder (dossier.dos_id)
* @param $p_date string (YYYYMMDD)
*/
function increment_mail(Database $p_repo,$p_dossier,$p_date)
{
$email_sent = $this->get_email_sent($p_repo,$p_dossier,$p_date);
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;
} else {
// update + sp_emaoun_email
$p_repo->exec_sql("update dossier_sent_email set de_sent_email=de_sent_email+1 where dos_id=$1 and de_date=$2",
array($p_dossier,$p_date));
}
}
}

View file

@ -0,0 +1,20 @@
begin;
ALTER TABLE public.ac_dossier ADD dos_email int4 NULL DEFAULT -1;
comment on column public.ac_dossier.dos_email is 'Max emails per day : 0 none , -1 unlimited or max value';
CREATE TABLE public.dossier_sent_email (
id serial primary key,
de_date varchar(8) NOT NULL,
de_sent_email int4 NOT NULL,
dos_id int4 NOT NULL
);
comment on table public.dossier_sent_email is 'Count the sent email by folder';
comment on column public.dossier_sent_email.id is 'primary key';
comment on column public.dossier_sent_email.de_date is 'Date YYYYMMDD';
comment on column public.dossier_sent_email.de_sent_email is 'Number of sent emails';
comment on column public.dossier_sent_email.dos_id is 'Link to ac_dossier';
alter table public.dossier_sent_email add constraint de_ac_dossier_fk foreign key (dos_id) references ac_dossier (dos_id ) on update cascade on delete cascade;
alter table public.dossier_sent_email add constraint de_date_dos_id_ux unique (de_date,dos_id);
select upgrade_repo(17);
commit;