-
-
Notifications
You must be signed in to change notification settings - Fork 2.6k
/
thirdparties_services_expired.modules.php
242 lines (205 loc) · 7.83 KB
/
thirdparties_services_expired.modules.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
<?php
/* Copyright (C) 2005-2010 Laurent Destailleur <eldy@users.sourceforge.net>
*
* 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/thirdparties_services_expired.modules.php
* \ingroup mailing
* \brief File of class to offer a selector of emailing targets with Rule 'services expired'.
*/
include_once DOL_DOCUMENT_ROOT.'/core/modules/mailings/modules_mailings.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
/**
* Class to offer a selector of emailing targets with Rule 'services expired'.
*/
class mailing_thirdparties_services_expired extends MailingTargets
{
var $name='DolibarrContractsLinesExpired';
var $desc='Third parties with expired contract\'s lines';
var $require_admin=0;
var $require_module=array('contrat');
var $picto='company';
var $db;
var $arrayofproducts=array();
/**
* Constructor
*
* @param DoliDB $db Database handler
*/
function __construct($db)
{
$this->db=$db;
$this->arrayofproducts=array();
// List of services
$sql = "SELECT ref FROM ".MAIN_DB_PREFIX."product";
$sql.= " WHERE entity IN (".getEntity('product', 1).")";
$sql.= " AND fk_product_type = 1";
$sql.= " ORDER BY ref";
$result=$this->db->query($sql);
if ($result)
{
$num = $this->db->num_rows($result);
dol_syslog("dolibarr_services_expired.modules.php:mailing_dolibarr_services_expired ".$num." services found");
$i = 0;
while ($i < $num)
{
$obj = $this->db->fetch_object($result);
$i++;
$this->arrayofproducts[$i]=$obj->ref;
}
}
else
{
dol_print_error($this->db);
}
}
/**
* This is the main function that returns the array of emails
*
* @param int $mailing_id Id of mailing. No need to use it.
* @param array $filtersarray If you used the formFilter function. Empty otherwise.
* @return int <0 if error, number of emails added if ok
*/
function add_to_target($mailing_id,$filtersarray=array())
{
$target = array();
// ----- Your code start here -----
$cibles = array();
$j = 0;
$product='';
foreach($filtersarray as $key)
{
if ($key == '0') return "Error: You must choose a filter";
$product=$this->arrayofproducts[$key];
}
$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.= " 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', 1).")";
$sql.= " AND s.email NOT IN (SELECT email FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE fk_mailing=".$mailing_id.")";
$sql.= " AND s.rowid = c.fk_soc AND cd.fk_contrat = c.rowid AND s.email != ''";
$sql.= " AND cd.statut= 4 AND cd.fk_product=p.rowid AND p.ref = '".$product."'";
$sql.= " AND cd.date_fin_validite < '".$this->db->idate($now)."'";
$sql.= " ORDER BY s.email";
// Stocke destinataires dans cibles
$result=$this->db->query($sql);
if ($result)
{
$num = $this->db->num_rows($result);
$i = 0;
dol_syslog(get_class($this)."::add_to_target ".$num." targets found");
$old = '';
while ($i < $num)
{
$obj = $this->db->fetch_object($result);
if ($old <> $obj->email)
{
$cibles[$j] = array(
'email' => $obj->email,
'lastname' => $obj->lastname,
'other' =>
('StartDate='.dol_print_date($this->db->jdate($obj->date_ouverture),'day')).';'.
('EndDate='.dol_print_date($this->db->jdate($obj->date_fin_validite),'day')).';'.
('Contract='.$obj->fk_contrat).';'.
('ContactLine='.$obj->cdid),
'source_url' => $this->url($obj->id),
'source_id' => $obj->id,
'source_type' => 'thirdparty'
);
$old = $obj->email;
$j++;
}
$i++;
}
}
else
{
dol_syslog($this->db->error());
$this->error=$this->db->error();
return -1;
}
// ----- Your code end here -----
return parent::add_to_target($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
*/
function getSqlArrayForStats()
{
//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 SQL request to use to count
* @return int Number of recipients
*/
function getNbOfRecipients($sql='')
{
$now=dol_now();
// Example: return parent::getNbOfRecipients("SELECT count(*) as nb from dolibarr_table");
// Example: return 500;
$sql = "SELECT count(*) as nb";
$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', 1).")";
$sql.= " AND s.rowid = c.fk_soc AND cd.fk_contrat = c.rowid AND s.email != ''";
$sql.= " AND cd.statut= 4 AND cd.fk_product=p.rowid";
$sql.= " AND p.ref IN ('".join("','",$this->arrayofproducts)."')";
$sql.= " AND cd.date_fin_validite < '".$this->db->idate($now)."'";
//print $sql;
$a=parent::getNbOfRecipients($sql);
return $a;
}
/**
* 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
*/
function formFilter()
{
global $langs;
$s='';
$s.='<select name="filter" class="flat">';
if (count($this->arrayofproducts)) $s.='<option value="0"> </option>';
else $s.='<option value="0">'.$langs->trans("ContactsAllShort").'</option>';
foreach($this->arrayofproducts as $key => $val)
{
$s.='<option value="'.$key.'">'.$val.'</option>';
}
$s.='</select>';
return $s;
}
/**
* Can include an URL link on each record provided by selector shown on target page.
*
* @param int $id ID
* @return string Url link
*/
function url($id)
{
//$companystatic=new Societe($this->db);
//$companystatic->id=$id;
//$companystatic->nom='';
//return $companystatic->getNomUrl(1); // Url too long
return '<a href="'.DOL_URL_ROOT.'/societe/soc.php?socid='.$id.'">'.img_object('',"company").'</a>';
}
}
?>