sendrecurringinvoicebymail/class/sribmcustommailinfo.class.php
2021-12-05 02:04:18 +01:00

523 lines
17 KiB
PHP
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/* Cpoyright (C) 2021 chl-dev@bugness.org
*
* 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 3 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, see <http://www.gnu.org/licenses/>.
*/
/**
* \file class/sribmcustommailinfo.class.php
* \brief File of class for objects storing custom mail informations (module SRIBM : SendRecurringInvoiceByMail)
*/
require_once DOL_DOCUMENT_ROOT . '/core/class/commonobject.class.php';
require_once DOL_DOCUMENT_ROOT . '/compta/facture/class/facture-rec.class.php';
require_once DOL_DOCUMENT_ROOT . '/contact/class/contact.class.php';
/**
* Class for objects storing custom mail informations.
*
* Part of module SRIBM : SendRecurringInvoiceByMail
*/
class SRIBMCustomMailInfo extends CommonObject
{
/**
* @var string Id to identify managed objects
*/
public $element = 'sribmcustommailinfo';
/**
* @var string Name of table without prefix where object is stored
*/
public $table_element = 'sribm_custom_mail_info';
// Database fields
/**
* @var int
*/
public $fk_facture_rec;
/**
* @var int
*/
public $active = 1;
/**
* @var string
*/
public $addmaindocfile = 1;
/**
* @var string Type of sender, could be 'robot', 'user' or 'company',
* usually meaning the mail sender is determined by the
* PHP/Dolibarr config (cf. admin/mails.php?mainmenu=home ),
* this object's creator email or the company email.
*/
public $fromtype = 'robot';
/**
* @var string
*/
public $frommail;
/**
* @var int 1: Send to societe main's email, 0: don't.
*/
public $sendto_thirdparty = 1;
/**
* @var string Format expected: "Foo <foo@example.com>, bar@example.net"
*/
public $sendto_free;
/**
* @var int 1: Send to societe main's email, 0: don't.
*/
public $sendcc_thirdparty = 0;
/**
* @var string Format expected: "Foo <foo@example.com>, bar@example.net"
*/
public $sendcc_free;
/**
* @var int 1: Send to societe main's email, 0: don't.
*/
public $sendbcc_thirdparty = 0;
/**
* @var string Format expected: "Foo <foo@example.com>, bar@example.net"
*/
public $sendbcc_free;
/**
* @var string
*/
public $subject;
/**
* @var string
*/
public $body;
/**
* @var int 0: plain text, 1: html, -1: auto (see CMailFile and dol_ishtml())
*/
public $body_ishtml = 0;
// End of database fields
/**
* FactureRec object linked to this object
*
* Note : the class Facture use $fac_rec and fk_fac_rec_source which both
* seem to be integer (I don't really see the distinction), so we suffix
* with '_object' to avoid future conflict.
*
* @var FactureRec
*/
public $fac_rec_object;
/**
* @var array SocPeoples linked via table llx_sribm_custom_mail_info_socpeople (FIXME: describe format)
*/
public $linkToSocPeoples = array();
/**
* Constructor
*
* @param DoliDb $db Database handler
*/
public function __construct(DoliDB $db)
{
global $conf;
$this->db = $db;
// Fill default values
$this->frommail = $conf->global->MAIN_MAIL_EMAIL_FROM;
}
/**
* Create object into database
*
* Since only one mail can exist for each invoice template, this method
* only insert a row with the id of the template and delegate all the work
* on the rest of the data to the update() method.
*
* @param User $user User that creates (at the moment, we don't use it)
* @param int $notrigger 1=do not execute triggers, 0 otherwise
* @return int >0 if OK, < 0 if KO
*/
public function create(User $user, $notrigger = 0)
{
$error=0;
$this->db->begin();
$sql = "INSERT INTO " . MAIN_DB_PREFIX . $this->table_element;
$sql .= " (fk_facture_rec, fromtype, frommail)";
$sql .= sprintf(
" VALUES (%d, '%s', '%s')",
(int)$this->fk_facture_rec,
$this->db->escape($this->fromtype),
$this->db->escape($this->frommail)
);
dol_syslog("SRIBMCustomMailInfo::create", LOG_DEBUG);
$result = $this->db->query($sql);
if ($result) {
$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . $this->table_element);
$result = $this->update($user, 1);
if ($result < 0) {
$this->db->rollback();
return -3;
}
if (! $notrigger)
{
// Call trigger
$result=$this->call_trigger('SRIBM_CUSTOM_MAIL_INFO_CREATE', $user);
if ($result < 0) {
$error++;
}
// End call triggers
}
if ($error) {
dol_syslog(get_class($this) . "::create " . $this->error, LOG_ERR);
$this->db->rollback();
return -2;
}
} else {
$this->error = $this->db->lasterror();
$this->db->rollback();
return -1;
}
$this->db->commit();
return $this->id;
}
/**
* Update object in database
*
* @param User $user User that creates (at the moment, we don't use it)
* @param int $notrigger 1=do not execute triggers, 0 otherwise
* @return int >0 if OK, < 0 if KO
*/
public function update(User $user, $notrigger = 0)
{
$error=0;
//$this->db->begin();
$sql = "UPDATE " . MAIN_DB_PREFIX . $this->table_element;
$sql .= " SET ";
$sql .= " fk_facture_rec = " . (int)$this->fk_facture_rec;
$sql .= ", active = " . (int)$this->active;
$sql .= ", addmaindocfile = " . (int)$this->addmaindocfile;
$sql .= ", fromtype = '" . $this->db->escape($this->fromtype) . "'";
$sql .= ", frommail = '" . $this->db->escape($this->frommail) . "'";
$sql .= ", sendto_thirdparty = " . (int)$this->db->escape($this->sendto_thirdparty);
$sql .= ", sendto_free = '" . $this->db->escape($this->sendto_free) . "'";
$sql .= ", sendcc_thirdparty = " . (int)$this->db->escape($this->sendcc_thirdparty);
$sql .= ", sendcc_free = '" . $this->db->escape($this->sendcc_free) . "'";
$sql .= ", sendbcc_thirdparty = " . (int)$this->db->escape($this->sendbcc_thirdparty);
$sql .= ", sendbcc_free = '" . $this->db->escape($this->sendbcc_free) . "'";
$sql .= ", subject = '" . $this->db->escape($this->subject) . "'";
$sql .= ", body = '" . $this->db->escape($this->body) . "'";
$sql .= ", body_ishtml = " . (int)$this->body_ishtml;
$sql .= " WHERE rowid = " . (int)$this->id;
$result = $this->db->query($sql);
if ($result) {
if (! $notrigger)
{
// Call trigger
$result=$this->call_trigger('SRIBM_CUSTOM_MAIL_INFO_MODIFY', $user);
if ($result < 0) {
$error++;
}
// End call triggers
}
if ($error) {
dol_syslog(get_class($this) . "::update " . $this->error, LOG_ERR);
$this->db->rollback();
return -$error;
}
} else {
$this->error = $this->db->lasterror();
$this->db->rollback();
return -1;
}
//$this->db->commit();
return 1;
}
/**
* Populate object with data from DB
*
* @param int $rowid Id of the SRIBMCustomMailInfo to load
* @param int $ref Id of the fac_rec_object
* @param bool $fill_defaults_from_template If true and the model doesn't exist in DB, fill attributes using the template
* @return int < 0 if KO, > 0 if OK
*/
public function fetch($rowid, $ref=null, $fill_defaults_from_template = false)
{
global $conf;
$sql = "SELECT rowid, fk_facture_rec, active, addmaindocfile, fromtype, frommail, sendto_thirdparty, sendto_free, sendcc_thirdparty, sendcc_free, sendbcc_thirdparty, sendbcc_free, subject, body, body_ishtml";
$sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element;
$sql .= " WHERE " . (isset($ref) ? 'fk_facture_rec = ' . (int)$ref : "rowid = " . (int)$rowid);
dol_syslog("SRIBMCustomMailInfo::fetch", LOG_DEBUG);
$result = $this->db->query($sql);
if (! $result) {
$this->error=$this->db->lasterror();
return -1;
}
if ($this->db->num_rows($result)) {
$obj = $this->db->fetch_object($result);
$this->id = $obj->rowid;
$this->fk_facture_rec = $obj->fk_facture_rec;
$this->active = $obj->active;
$this->addmaindocfile = $obj->addmaindocfile;
$this->fromtype = $obj->fromtype;
$this->frommail = $obj->frommail;
$this->sendto_thirdparty = $obj->sendto_thirdparty;
$this->sendto_free = $obj->sendto_free;
$this->sendcc_thirdparty = $obj->sendcc_thirdparty;
$this->sendcc_free = $obj->sendcc_free;
$this->sendbcc_thirdparty = $obj->sendbcc_thirdparty;
$this->sendbcc_free = $obj->sendbcc_free;
$this->subject = $obj->subject;
$this->body = $obj->body;
$this->body_ishtml = $obj->body_ishtml;
$ref = $obj->fk_facture_rec;
} elseif (!$fill_defaults_from_template) {
$this->error = "SRIBMCustomMailInfo not found (id: " . var_export($rowid, true) . ", ref: " . var_export($ref, true);
dol_syslog("SRIBMCustomMailInfo::fetch error " . $this->error, LOG_ERR);
}
// It seems to be usual to fully fetch by default (cf. Facture source
// code with fetch_optionals()) so we copy the Dolibarr behaviour
// Link to the facture_rec
$this->fac_rec_object = new FactureRec($this->db);
if ($this->fac_rec_object->fetch($ref) <= 0) {
$this->error = "Unable to fetch FactureRec $ref.";
dol_syslog("FactureRec::Fetch error " . $this->error, LOG_ERR);
return -2;
}
if ($this->fac_rec_object->fetch_thirdparty() <= 0) {
$this->error = "Unable to fetch ThirdParty for FactureRec $ref.";
dol_syslog("FactureRec::FetchThirdParty error " . $this->error, LOG_ERR);
return -3;
}
$result = $this->fac_rec_object->fetchObjectLinked(null, '', null, '', 'OR', 1, 'sourcetype', 0); // This load $_facrec->linkedObjectsIds
// link to socpeople
if ($this->id) {
// FIXME: create a dedicated PHP class?
$sql = "SELECT fk_socpeople, sendtype";
$sql .= " FROM " . MAIN_DB_PREFIX . "sribm_custom_mail_info_socpeople";
$sql .= " WHERE fk_sribm_cmi = " . (int)$this->id;
$result = $this->db->query($sql);
if (! $result) {
$this->error=$this->db->lasterror();
return -1;
}
// reset the attribute
$this->linkToSocPeoples = array();
while ($obj = $this->db->fetch_object($result)) {
$tmp = new Contact($this->db);
if ($tmp->fetch($obj->fk_socpeople) > 0) {
$tmp->pivot = $obj;
$this->linkToSocPeoples[] = $tmp;
}
}
}
// Optionally, if the model hasn't been found (no id), we fill with the template's data
if (!$this->id && $fill_defaults_from_template) {
$result = $this->db->query("SELECT topic, content, joinfiles FROM " . MAIN_DB_PREFIX . "c_email_templates WHERE module = 'sendrecurringinvoicebymail' AND active = 1 AND enabled = '1' ORDER BY tms DESC LIMIT 1");
if ( ! $result or ! ($template = $this->db->fetch_object($result))) {
$this->error = "Can't find mail template for sendrecurringinvoicebymail";
dol_syslog("SRIBMCustomMailInfo::fetch error " . $this->error, LOG_ERR);
return -4;
}
$this->subject = $template->topic;
$this->body = $template->content;
$this->addmaindocfile = $template->joinfiles;
// By default, we don't send emails when the generated invoice is
// still a draft.
$this->active = $this->fac_rec_object->auto_validate;
// Retrieve the default body format from config.
$this->body_ishtml = $conf->global->SENDRECURRINGINVOICEBYMAIL_BODY_ISHTML_DEFAULT;
}
return 1;
}
/**
* Delete this object's record in database
*
* @return int <0 on error, >0 if OK
*/
public function delete()
{
$error=0;
//$this->db->begin();
$sql = "DELETE FROM " . MAIN_DB_PREFIX . $this->table_element;
$sql .= " WHERE rowid = " . (int)$this->id;
$result = $this->db->query($sql);
if (! $result) {
//$this->db->rollback();
$this->error = $this->db->lasterror();
return -1;
}
// Call trigger
$result = $this->call_trigger('SRIBM_CUSTOM_MAIL_INFO_DELETE', $user);
if ($result < 0) {
$error++;
}
// End call triggers
if ($error) {
dol_syslog(get_class($this) . "::delete " . $this->error, LOG_ERR);
//$this->db->rollback();
return -$error;
}
//$this->db->commit();
return 1;
}
/**
* Quick function to synchronize the links between this object and its contacts
*
* Format of the data :
* array(
* array('id' => id_contact_1, 'sendtype' => 'to'),
* array('id' => id_contact_2, 'sendtype' => 'cc'),
* ...
*
* @param array $data Format : see above
* @return int <0 on error, >0 if OK
*/
public function updateLinkSocPeople($data)
{
$this->db->begin();
$result = $this->db->query("DELETE FROM " . MAIN_DB_PREFIX . "sribm_custom_mail_info_socpeople where fk_sribm_cmi = " . (int)$this->id);
if (! $result) {
$this->error=$this->db->lasterror();
$this->db->rollback();
return -1;
}
if ($data) {
$sql = "INSERT INTO " . MAIN_DB_PREFIX . "sribm_custom_mail_info_socpeople";
$sql .= " (fk_sribm_cmi, fk_socpeople, sendtype) VALUES (%d, %d, '%s')";
foreach ($data as $item) {
// We insert one by one to maximize compatibility
// (if there happens to be thousands of links, I'll rework it :)
$result = $this->db->query(sprintf(
$sql,
$this->id,
$item['id'],
$this->db->escape($item['sendtype'])
));
if (! $result) {
$this->error=$this->db->lasterror();
$this->db->rollback();
return -2;
}
}
}
$this->db->commit();
return 1;
}
/**
* Helper to compile the recipients in one string from sendto_thirdparty,
* sendto_free and socpeople.
*
* @param string $sendtype One of 'to', 'cc', 'bcc'
* @param bool $filterBadEmail If true, don't include recipients with empty/bad email address
* @return string String compiling emails in the format 'Foo <foo@example.com>, bar@example.com'
*/
public function compileEmails($sendtype, $filterBadEmails = false)
{
$output = array();
$listContacts = $this->fac_rec_object->thirdparty->thirdparty_and_contact_email_array(1);
switch ($sendtype) {
case 'to':
if ($this->sendto_free) {
$output[] = $this->sendto_free;
}
if ($this->sendto_thirdparty) {
$output[] = $listContacts['thirdparty'];
}
break;
case 'cc':
if ($this->sendcc_free) {
$output[] = $this->sendcc_free;
}
if ($this->sendcc_thirdparty) {
$output[] = $listContacts['thirdparty'];
}
break;
case 'bcc':
if ($this->sendbcc_free) {
$output[] = $this->sendbcc_free;
}
if ($this->sendbcc_thirdparty) {
$output[] = $listContacts['thirdparty'];
}
break;
}
foreach ($this->linkToSocPeoples as $contact) {
if ($contact->pivot->sendtype == $sendtype) {
$output[] = $listContacts[$contact->id];
}
}
if ($filterBadEmails) {
// TODO
}
return $output;
}
}