From b5bc4bca938fdd3956e57a02ebcb0be274d32b4f Mon Sep 17 00:00:00 2001 From: Chl Date: Tue, 23 Mar 2021 15:27:33 +0100 Subject: [PATCH] v. 0.3.0 : customization form for each recurring invoice --- ChangeLog.md | 3 + README.md | 61 +- ...tions_sendrecurringinvoicebymail.class.php | 338 ++++------ class/sribmcustommailinfo.class.php | 516 +++++++++++++++ .../modsendrecurringinvoicebymail.class.php | 622 ++++++++++-------- fiche-rec-tab1.php | 326 +++++++++ img/screenshot1.png | Bin 0 -> 131363 bytes langs/en_US/sendrecurringinvoicebymail.lang | 19 +- langs/fr_FR/sendrecurringinvoicebymail.lang | 17 +- sql/data.sql | 14 + sql/llx_sribm_custom_mail_info.key.sql | 29 + sql/llx_sribm_custom_mail_info.sql | 49 ++ 12 files changed, 1470 insertions(+), 524 deletions(-) create mode 100644 class/sribmcustommailinfo.class.php create mode 100644 fiche-rec-tab1.php create mode 100644 img/screenshot1.png create mode 100644 sql/data.sql create mode 100644 sql/llx_sribm_custom_mail_info.key.sql create mode 100644 sql/llx_sribm_custom_mail_info.sql diff --git a/ChangeLog.md b/ChangeLog.md index 4cc1cb8..906f983 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5 +1,8 @@ # CHANGELOG SENDRECURRINGINVOICEBYMAIL FOR DOLIBARR ERP CRM +## 0.3.0 +Dedicated tab on the template invoice's page, to be able to customize more cleanly the recipients, and the email content. + ## 0.2.7 Add the possibility to overwrite some email fields (recipients, subject, body) for each template. diff --git a/README.md b/README.md index 904240b..39a3144 100644 --- a/README.md +++ b/README.md @@ -2,62 +2,31 @@ ## Features -This module send the PDF generated with recurring invoices by email to the client. +(en) This module send the invoice generated with recurring invoices by email to the client. -You can customize the mail template in Home > Setup > Emails > Email templates. +(fr) Ce module envoie par mail les factures générées automatiquement par les travaux planifiés et les factures modèles. -Beta - test in progress : you can also customize for each template invoice, by adding some of those blocks in the private notes of the template. -``` -This is a good client (this is outside of the %%% blocks so it won't appear in the mails :) +You can customize the mail globally or by recurring invoice. -%%% sendrecurringinvoicebymail::body -Hello dear client, +![Screenshot n° 1](img/screenshot1.png?raw=true) -Please find attached... invoice __REF__... +To edit the default global mail template, go to Home > Setup > Emails > Email templates, and modify the `SendRecurringInvoiceByMail : original template`. If you don't want to attach the PDF of the invoice to the mails, set the `Attach file` input to 0 (default: 1, PDF attached). -__(Sincerely)__, +To edit the default sender address, go to Home > Setup > Emails, and edit the `Sender email for automatic emails` field. -__MYCOMPANY_NAME__ -%%% - -%%% sendrecurringinvoicebymail::subject -My custom subject -%%% -%%% sendrecurringinvoicebymail::sendto -test1@example.org, "Mr. Test2" -%%% -``` +This module is triggered by the cron (Scheduled jobs module) and will not send emails when manually generating an invoice. ## Requirements -It requires Dolibarr version 10.0 at least (first version with the 'cron/afterCreationOfRecurringInvoice()' hook). +It requires Dolibarr version 10.0 at least (first version with the `cron/afterCreationOfRecurringInvoice()` hook). - +Don't forget to also activate the **Scheduled jobs** module. Other modules are available on Dolistore.com. - - - - - +* Disable the module, +* Update the files (see Install), +* Re-enable the module. -Licenses --------- +## Licenses ### Main code diff --git a/class/actions_sendrecurringinvoicebymail.class.php b/class/actions_sendrecurringinvoicebymail.class.php index f1080d2..b569c95 100644 --- a/class/actions_sendrecurringinvoicebymail.class.php +++ b/class/actions_sendrecurringinvoicebymail.class.php @@ -23,224 +23,174 @@ * Put detailed description here. */ + // Load needed classes/lib + require_once 'sribmcustommailinfo.class.php'; + /** * Class Actionssendrecurringinvoicebymail */ class Actionssendrecurringinvoicebymail { - /** - * @var DoliDB Database handler. - */ - public $db; + /** + * @var DoliDB Database handler. + */ + public $db; - /** - * @var string Error code (or message) - */ - public $error = ''; + /** + * @var string Error code (or message) + */ + public $error = ''; - /** - * @var array Errors - */ - public $errors = array(); + /** + * @var array Errors + */ + public $errors = array(); - /** - * @var array Hook results. Propagated to $hookmanager->resArray for later reuse - */ - public $results = array(); + /** + * @var array Hook results. Propagated to $hookmanager->resArray for later reuse + */ + public $results = array(); - /** - * @var string String displayed by executeHook() immediately after return - */ - public $resprints; + /** + * @var string String displayed by executeHook() immediately after return + */ + public $resprints; - /** - * Constructor - * - * @param DoliDB $db Database handler - */ - public function __construct($db) - { - $this->db = $db; - } + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + public function __construct($db) + { + $this->db = $db; + } - /** - * Overloading the doActions function : replacing the parent's function with the one below - * - * @param array $parameters Hook metadatas (context, etc...) - * @param CommonObject $object The object to process (an invoice if you are in invoice module, a propale in propale's module, etc...) - * @param string $action Current action (if set). Generally create or edit or null - * @param HookManager $hookmanager Hook manager propagated to allow calling another hook - * @return int < 0 on error, 0 on success, 1 to replace standard code - */ - public function afterCreationOfRecurringInvoice($parameters, &$object, &$action, $hookmanager) - { - global $conf, $user, $langs; - $langs->load('mails'); + /** + * Overloading the doActions function : replacing the parent's function with the one below + * + * @param array $parameters Hook metadatas (context, etc...) + * @param CommonObject $object The object to process (an invoice if you are in invoice module, a propale in propale's module, etc...) + * @param string $action Current action (if set). Generally create or edit or null + * @param HookManager $hookmanager Hook manager propagated to allow calling another hook + * @return int < 0 on error, 0 on success, 1 to replace standard code + */ + public function afterCreationOfRecurringInvoice($parameters, &$object, &$action, $hookmanager) + { + global $conf, $user, $langs; + $langs->load('mails'); - $error = 0; // Error counter + $error = 0; // Error counter - $facturerec = $parameters['facturerec']; + $facturerec = $parameters['facturerec']; + $mailObject = new SRIBMCustomMailInfo($this->db); + if ($mailObject->fetch(null, $facturerec->id, true) != 1) { + dol_syslog("Error loading SRIBMCustomMailInfo for facture rec " . (isset($facturerec->id) ? $facturerec->id : "(facturerec->id not set ??)")); + return -1; + } - // We only send the mail when the invoice is not a draft - if ($object->brouillon) { - return 0; - } + // We only send the mail when the invoice is not a draft + // and the sending is enabled for the template. + if ($object->brouillon || !$mailObject->active) { + return 0; + } - // Fetch the mail template - // (pas très précise mais je commence à en avoir marre de creuser tout dolibarr pour trouver les bonnes fonctions...) - $result = $this->db->query("SELECT * 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"; - $this->errors[] = $this->error; - $error++; - return -1; - } + // Prepare the substitions for mail's subject and message (ex-body) + $substitutionarray = getCommonSubstitutionArray($langs, 0, null, $object); + complete_substitutions_array($substitutionarray, $langs, $object); // lourd et n'a rien ajouté lors de mes tests - // Prepare the substitions for mail's subject and body - $substitutionarray = getCommonSubstitutionArray($langs, 0, null, $object); - complete_substitutions_array($substitutionarray, $langs, $object); // lourd et n'a rien ajouté lors de mes tests + // Adding some useful substitions of our own... + if ( ! empty($object->linkedObjects['contrat'])) { + $contrat = reset($object->linkedObjects['contrat']); // no deep search, we take the first linked contract + $substitutionarray['__CONTRACT_REF__'] = $contrat->ref; + } - // Adding some useful substitions of our own... - if ( ! empty($object->linkedObjects['contrat'])) { - $contrat = reset($object->linkedObjects['contrat']); // no deep search, we take the first linked contract - $substitutionarray['__CONTRACT_REF__'] = $contrat->ref; - } + // Initialisations + $mail_data = array( + 'from' => $mailObject->frommail, + 'to' => implode(', ', $mailObject->compileEmails('to', true)), + 'cc' => implode(', ', $mailObject->compileEmails('cc', true)), + 'bcc' => implode(', ', $mailObject->compileEmails('bcc', true)), + 'errorsTo' => $conf->global->MAIN_MAIL_ERRORS_TO, + 'replyTo' => $conf->global->MAIN_MAIL_ERRORS_TO, + 'subject' => $mailObject->subject, + 'message' => $mailObject->body_plaintext, + ); - // Initialisations - $mail_data = array( - 'sendto' => $object->thirdparty->name . ' <' . $object->thirdparty->email . '>', - 'from' => $conf->global->MAIN_MAIL_EMAIL_FROM, - 'errorsTo' => $conf->global->MAIN_MAIL_ERRORS_TO, - 'replyTo' => $conf->global->MAIN_MAIL_ERRORS_TO, - 'subject' => $template->topic, - 'body' => $template->content, - ); + // Check that we have a recipient, to avoid some frequent error... + if (empty($mail_data['to'] . $mail_data['cc'] . $mail_data['bcc'])) { + dol_syslog("Empty recipient for thirdparty " . $object->thirdparty->id . ". Not sending facturerec " . $facturerec->ref . " (id:" . $facturerec->id . ")."); + return 0; + } - // If the invoice has some custom parameters (subject, body, sendto, ...) - $mail_data = array_merge($mail_data, $this->getCustomFieldsMail($object)); + // Make the substitutions + foreach (array('subject', 'message') as $key) { + $mail_data[$key] = make_substitutions($mail_data[$key], $substitutionarray, $langs); + if (method_exists($object, 'makeSubstitution')) { + $mail_data[$key] = $object->makeSubstitution($mail_data[$key]); + } + } - // Check that we have a recipient, to avoid some frequent error... - if (empty($mail_data['sendto'])) { - dol_syslog("Empty recipient for thirdparty " . $object->thirdparty->id . ". Not sending facturerec " . $facturerec->ref . " (id:" . $facturerec->id . ")."); - return 0; - } + // Check if we have to attach the file + $filePath = array(); + $fileMime = array(); + $fileName = array(); + if ($mailObject->addmaindocfile) { + $filePath = array(DOL_DATA_ROOT . '/' . $object->last_main_doc); + $fileMime = array('application/pdf'); // FIXME: à rendre dynamique, même si ce sera toujours du PDF ? + $fileName = array(basename($object->last_main_doc)); + } - // Make the substitutions - foreach (array('subject', 'body') as $key) { - $mail_data[$key] = make_substitutions($mail_data[$key], $substitutionarray, $langs); - if (method_exists($object, 'makeSubstitution')) { - $mail_data[$key] = $object->makeSubstitution($mail_data[$key]); - } - } + // At last, send the mail + $mailfile = new CMailFile( + $mail_data['subject'], + $mail_data['to'], + $mail_data['from'], + $mail_data['message'], + $filePath, + $fileMime, + $fileName, + $mail_data['cc'], // CC + $mail_data['bcc'], // BCC + 0, //deliveryreceipt + 0, //msgishtml + $mail_data['errorsTo'], + '', // css + '', // trackid + '', // moreinheader + 'standard', // sendcontext + $mail_data['replyTo']); - // Check if we have to attach the file - $filePath = array(); - $fileMime = array(); - $fileName = array(); - if ($template->joinfiles) { - $filePath = array(DOL_DATA_ROOT . '/' . $object->last_main_doc); - $fileMime = array('application/pdf'); // FIXME: à rendre dynamique, même si ce sera toujours du PDF ? - $fileName = array(basename($object->last_main_doc)); - } + if ($mailfile->sendfile()) { + dol_syslog("Success sending email for " . $facturerec->ref . " (id:" . $facturerec->id . ")."); - // At last, send the mail - $mailfile = new CMailFile( - $mail_data['subject'], - $mail_data['sendto'], - $mail_data['from'], - $mail_data['body'], - $filePath, - $fileMime, - $fileName, - '', // CC - '', // BCC - 0, //deliveryreceipt - 0, //msgishtml - $mail_data['errorsTo'], - '', // css - '', // trackid - '', // moreinheader - 'standard', // sendcontext - $mail_data['replyTo']); + // Adds info to object for trigger + // (maybe make a copy of the object instead of modifying it directly ?) + $object->email_msgid = $mailfile->msgid; + $object->email_from = $mail_data['from']; + $object->email_subject = $mail_data['subject']; + $object->email_to = $mail_data['to']; + $object->email_tocc = $mail_data['cc']; + $object->email_tobcc = $mail_data['bcc']; + $object->actiontypecode = 'AC_OTH_AUTO'; + $object->actionmsg2=$langs->transnoentities('MailSentBy').' '.CMailFile::getValidAddress($mail_data['from'],4,0,1).' '.$langs->transnoentities('To').' '.CMailFile::getValidAddress($mail_data['to'],4,0,1); + $object->actionmsg = $langs->transnoentities('MailFrom').': '.dol_escape_htmltag($mail_data['from']); + $object->actionmsg = dol_concatdesc($object->actionmsg, $langs->transnoentities('MailTo').': '.dol_escape_htmltag($mail_data['to'])); + $object->actionmsg = dol_concatdesc($object->actionmsg, $langs->transnoentities('MailTopic') . ": " . $mail_data['subject']); + $object->actionmsg = dol_concatdesc($object->actionmsg, $langs->transnoentities('TextUsedInTheMessageBody') . ":"); + $object->actionmsg = dol_concatdesc($object->actionmsg, $mail_data['message']); - if ($mailfile->sendfile()) { - dol_syslog("Success sending email for " . $facturerec->ref . " (id:" . $facturerec->id . ")."); - - // Adds info to object for trigger - // (maybe make a copy of the object instead of modifying it directly ?) - $object->email_msgid = $mailfile->msgid; - $object->email_from = $mail_data['from']; - $object->email_subject = $mail_data['subject']; - $object->email_to = $mail_data['sendto']; - //$object->email_tocc = $sendtocc; - //$object->email_tobcc = $sendtobcc; - $object->actiontypecode = 'AC_OTH_AUTO'; - $object->actionmsg2=$langs->transnoentities('MailSentBy').' '.CMailFile::getValidAddress($mail_data['from'],4,0,1).' '.$langs->transnoentities('To').' '.CMailFile::getValidAddress($mail_data['sendto'],4,0,1); - $object->actionmsg = $langs->transnoentities('MailFrom').': '.dol_escape_htmltag($mail_data['from']); - $object->actionmsg = dol_concatdesc($object->actionmsg, $langs->transnoentities('MailTo').': '.dol_escape_htmltag($mail_data['sendto'])); - $object->actionmsg = dol_concatdesc($object->actionmsg, $langs->transnoentities('MailTopic') . ": " . $mail_data['subject']); - $object->actionmsg = dol_concatdesc($object->actionmsg, $langs->transnoentities('TextUsedInTheMessageBody') . ":"); - $object->actionmsg = dol_concatdesc($object->actionmsg, $mail_data['body']); - - // Launch triggers - $interface = new Interfaces($this->db); - $resultTrigger = $interface->run_triggers('BILL_SENTBYMAIL', $object, $user, $langs, $conf); - } else { - $this->error = "Error sending email for " . $facturerec->ref . " (id:" . $facturerec->id . ")."; - $this->errors[] = $this->error; - dol_syslog($this->error); - $error++; - } - - return ($error ? -1 : 0); - } - - - /** - * FIXME: For the time being, we abuse of note_private to store our customizations - */ - public function getCustomFieldsMail($object) - { - return $this->parseCustomFieldsMail($object->note_private); - } - - /** - * FIXME: For the time being, we abuse of note_private to store our customizations - * - * This expect something like this in note_private: - * This is a good client... (other private infos) - * %%% sendrecurringinvoicebymail::subject - * New invoice __REF__ - * %%% - * %%% sendrecurringinvoicebymail::sendto - * recipient1@example.org, recipient2@example.org - * %%% - * %%% sendrecurringinvoicebymail::body - * Hello dear client, - * Please find attached... - * %%% - */ - public function parseCustomFieldsMail($data) - { - $output = []; - - // Remove eventual windows' "\r" - $data = str_replace("\r", "", $data); - - $regexps = array( - 'subject' => '/(^|\n)%%% sendrecurringinvoicebymail::subject\n(?.*)%%%(\n|$)/sU', - 'body' => '/(^|\n)%%% sendrecurringinvoicebymail::body\n(?.*)%%%(\n|$)/sU', - 'sendto' => '/(^|\n)%%% sendrecurringinvoicebymail::sendto\n(?.*)%%%(\n|$)/sU', - ); - foreach ($regexps as $key => $r) { - $result_regexp = []; - if (preg_match_all($r, $data, $result_regexp)) { - $output[$key] = trim($result_regexp[$key][0]); - } - } - - return $output; - } + // Launch triggers + $interface = new Interfaces($this->db); + $resultTrigger = $interface->run_triggers('BILL_SENTBYMAIL', $object, $user, $langs, $conf); + } else { + $this->error = "Error sending email for " . $facturerec->ref . " (id:" . $facturerec->id . ")."; + $this->errors[] = $this->error; + dol_syslog($this->error); + $error++; + } + return ($error ? -1 : 0); + } } diff --git a/class/sribmcustommailinfo.class.php b/class/sribmcustommailinfo.class.php new file mode 100644 index 0000000..6559134 --- /dev/null +++ b/class/sribmcustommailinfo.class.php @@ -0,0 +1,516 @@ +. + */ + +/** + * \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 , 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 , 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 , bar@example.net" + */ + public $sendbcc_free; + + /** + * @var string + */ + public $subject; + + /** + * @var string + */ + public $body_plaintext; + + /** + * @var string (not used at the moment) + */ + public $body_html; + + // 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_plaintext = '" . $this->db->escape($this->body_plaintext) . "'"; + $sql .= ", body_html = '" . $this->db->escape($this->body_html) . "'"; + $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_plaintext, body_html"; + $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_plaintext = $obj->body_plaintext; + $this->body_html = $obj->body_html; + $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_plaintext = $template->content; + $this->addmaindocfile = $template->joinfiles; + } + + 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 , 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; + } +} diff --git a/core/modules/modsendrecurringinvoicebymail.class.php b/core/modules/modsendrecurringinvoicebymail.class.php index 176e9b7..9d816d3 100644 --- a/core/modules/modsendrecurringinvoicebymail.class.php +++ b/core/modules/modsendrecurringinvoicebymail.class.php @@ -1,6 +1,6 @@ - * Copyright (C) 2018 Nicolas ZABOURI + * Copyright (C) 2018 Nicolas ZABOURI * Copyright (C) 2018 SuperAdmin * * This program is free software; you can redistribute it and/or modify @@ -18,7 +18,7 @@ */ /** - * \defgroup sendrecurringinvoicebymail Module sendrecurringinvoicebymail + * \defgroup sendrecurringinvoicebymail Module sendrecurringinvoicebymail * \brief sendrecurringinvoicebymail module descriptor. * * \file htdocs/sendrecurringinvoicebymail/core/modules/modsendrecurringinvoicebymail.class.php @@ -33,324 +33,412 @@ include_once DOL_DOCUMENT_ROOT .'/core/modules/DolibarrModules.class.php'; */ class modsendrecurringinvoicebymail extends DolibarrModules { - /** - * Constructor. Define names, constants, directories, boxes, permissions - * - * @param DoliDB $db Database handler - */ - public function __construct($db) - { + /** + * Constructor. Define names, constants, directories, boxes, permissions + * + * @param DoliDB $db Database handler + */ + public function __construct($db) + { global $langs,$conf; $this->db = $db; - // Id for module (must be unique). - // Use here a free id (See in Home -> System information -> Dolibarr for list of used modules id). - $this->numero = 468101; // TODO Go on page https://wiki.dolibarr.org/index.php/List_of_modules_id to reserve id number for your module - // Key text used to identify module (for permissions, menus, etc...) - $this->rights_class = 'sendrecurringinvoicebymail'; + // Id for module (must be unique). + // Use here a free id (See in Home -> System information -> Dolibarr for list of used modules id). + $this->numero = 468101; // TODO Go on page https://wiki.dolibarr.org/index.php/List_of_modules_id to reserve id number for your module + // Key text used to identify module (for permissions, menus, etc...) + $this->rights_class = 'sendrecurringinvoicebymail'; - // Family can be 'base' (core modules),'crm','financial','hr','projects','products','ecm','technic' (transverse modules),'interface' (link with external tools),'other','...' - // It is used to group modules by family in module setup page - $this->family = "crm"; - // Module position in the family on 2 digits ('01', '10', '20', ...) - $this->module_position = '90'; - // Gives the possibility for the module, to provide his own family info and position of this family (Overwrite $this->family and $this->module_position. Avoid this) - //$this->familyinfo = array('myownfamily' => array('position' => '01', 'label' => $langs->trans("MyOwnFamily"))); + // Family can be 'base' (core modules),'crm','financial','hr','projects','products','ecm','technic' (transverse modules),'interface' (link with external tools),'other','...' + // It is used to group modules by family in module setup page + $this->family = "crm"; + // Module position in the family on 2 digits ('01', '10', '20', ...) + $this->module_position = '90'; + // Gives the possibility for the module, to provide his own family info and position of this family (Overwrite $this->family and $this->module_position. Avoid this) + //$this->familyinfo = array('myownfamily' => array('position' => '01', 'label' => $langs->trans("MyOwnFamily"))); - // Module label (no space allowed), used if translation string 'ModulesendrecurringinvoicebymailName' not found (sendrecurringinvoicebymail is name of module). - $this->name = preg_replace('/^mod/i','',get_class($this)); - // Module description, used if translation string 'ModulesendrecurringinvoicebymailDesc' not found (sendrecurringinvoicebymail is name of module). - $this->description = "Send generated invoice by email"; - // Used only if file README.md and README-LL.md not found. - $this->descriptionlong = "This module hooks onto the recurring invoice generation to automatically send the generated PDF."; + // Module label (no space allowed), used if translation string 'ModulesendrecurringinvoicebymailName' not found (sendrecurringinvoicebymail is name of module). + $this->name = preg_replace('/^mod/i','',get_class($this)); + // Module description, used if translation string 'ModulesendrecurringinvoicebymailDesc' not found (sendrecurringinvoicebymail is name of module). + $this->description = "Send generated invoice by email"; + // Used only if file README.md and README-LL.md not found. + $this->descriptionlong = "This module hooks onto the recurring invoice generation to automatically send the generated PDF."; - $this->editor_name = 'Bugness'; - $this->editor_url = 'https://code.bugness.org/Dolibarr/sendrecurringinvoicebymail'; + $this->editor_name = 'Bugness'; + $this->editor_url = 'https://code.bugness.org/Dolibarr/sendrecurringinvoicebymail'; - // Possible values for version are: 'development', 'experimental', 'dolibarr', 'dolibarr_deprecated' or a version string like 'x.y.z' - $this->version = '0.2.7'; + // Possible values for version are: 'development', 'experimental', 'dolibarr', 'dolibarr_deprecated' or a version string like 'x.y.z' + $this->version = '0.3.0'; - //Url to the file with your last numberversion of this module - //$this->url_last_version = 'http://www.example.com/versionmodule.txt'; - // Key used in llx_const table to save module status enabled/disabled (where SENDRECURRINGINVOICEBYMAIL is value of property name of module in uppercase) - $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); - // Name of image file used for this module. - // If file is in theme/yourtheme/img directory under name object_pictovalue.png, use this->picto='pictovalue' - // If file is in module/img directory under name object_pictovalue.png, use this->picto='pictovalue@module' - $this->picto = 'sendrecurringinvoicebymail@sendrecurringinvoicebymail'; + //Url to the file with your last numberversion of this module + //$this->url_last_version = 'http://www.example.com/versionmodule.txt'; + // Key used in llx_const table to save module status enabled/disabled (where SENDRECURRINGINVOICEBYMAIL is value of property name of module in uppercase) + $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); + // Name of image file used for this module. + // If file is in theme/yourtheme/img directory under name object_pictovalue.png, use this->picto='pictovalue' + // If file is in module/img directory under name object_pictovalue.png, use this->picto='pictovalue@module' + $this->picto = 'sendrecurringinvoicebymail@sendrecurringinvoicebymail'; - // Define some features supported by module (triggers, login, substitutions, menus, css, etc...) - $this->module_parts = array( - 'triggers' => 0, // Set this to 1 if module has its own trigger directory (core/triggers) - 'login' => 0, // Set this to 1 if module has its own login method file (core/login) - 'substitutions' => 0, // Set this to 1 if module has its own substitution function file (core/substitutions) - 'menus' => 0, // Set this to 1 if module has its own menus handler directory (core/menus) - 'theme' => 0, // Set this to 1 if module has its own theme directory (theme) - 'tpl' => 0, // Set this to 1 if module overwrite template dir (core/tpl) - 'barcode' => 0, // Set this to 1 if module has its own barcode directory (core/modules/barcode) - 'models' => 0, // Set this to 1 if module has its own models directory (core/modules/xxx) - //'css' => array('/sendrecurringinvoicebymail/css/sendrecurringinvoicebymail.css.php'), // Set this to relative path of css file if module has its own css file - //'js' => array('/sendrecurringinvoicebymail/js/sendrecurringinvoicebymail.js.php'), // Set this to relative path of js file if module must load a js on all pages - 'hooks' => array('cron'), // Set here all hooks context managed by module. To find available hook context, make a "grep -r '>initHooks(' *" on source code. You can also set hook context 'all' - 'moduleforexternal' => 0 // Set this to 1 if feature of module are opened to external users - ); + // Define some features supported by module (triggers, login, substitutions, menus, css, etc...) + $this->module_parts = array( + 'triggers' => 0, // Set this to 1 if module has its own trigger directory (core/triggers) + 'login' => 0, // Set this to 1 if module has its own login method file (core/login) + 'substitutions' => 0, // Set this to 1 if module has its own substitution function file (core/substitutions) + 'menus' => 0, // Set this to 1 if module has its own menus handler directory (core/menus) + 'theme' => 0, // Set this to 1 if module has its own theme directory (theme) + 'tpl' => 0, // Set this to 1 if module overwrite template dir (core/tpl) + 'barcode' => 0, // Set this to 1 if module has its own barcode directory (core/modules/barcode) + 'models' => 0, // Set this to 1 if module has its own models directory (core/modules/xxx) + 'css' => array(), + //'css' => array('/sendrecurringinvoicebymail/css/sendrecurringinvoicebymail.css.php'), // Set this to relative path of css file if module has its own css file + 'js' => array(), + //'js' => array('/sendrecurringinvoicebymail/js/sendrecurringinvoicebymail.js.php'), // Set this to relative path of js file if module must load a js on all pages + 'hooks' => array('cron'), // Set here all hooks context managed by module. To find available hook context, make a "grep -r '>initHooks(' *" on source code. You can also set hook context 'all' + 'moduleforexternal' => 0 // Set this to 1 if feature of module are opened to external users + ); - // Data directories to create when module is enabled. - // Example: this->dirs = array("/sendrecurringinvoicebymail/temp","/sendrecurringinvoicebymail/subdir"); - $this->dirs = array("/sendrecurringinvoicebymail/temp"); + // Data directories to create when module is enabled. + // Example: this->dirs = array("/sendrecurringinvoicebymail/temp","/sendrecurringinvoicebymail/subdir"); + $this->dirs = array("/sendrecurringinvoicebymail/temp"); - // Config pages. Put here list of php page, stored into sendrecurringinvoicebymail/admin directory, to use to setup module. - //$this->config_page_url = array("setup.php@sendrecurringinvoicebymail"); + // Config pages. Put here list of php page, stored into sendrecurringinvoicebymail/admin directory, to use to setup module. + //$this->config_page_url = array("setup.php@sendrecurringinvoicebymail"); - // Dependencies - $this->hidden = false; // A condition to hide module - $this->depends = array('modFacture'); // List of module class names as string that must be enabled if this module is enabled. Example: array('always1'=>'modModuleToEnable1','always2'=>'modModuleToEnable2', 'FR1'=>'modModuleToEnableFR'...) - $this->requiredby = array(); // List of module class names as string to disable if this one is disabled. Example: array('modModuleToDisable1', ...) - $this->conflictwith = array(); // List of module class names as string this module is in conflict with. Example: array('modModuleToDisable1', ...) - $this->langfiles = array("sendrecurringinvoicebymail@sendrecurringinvoicebymail"); - //$this->phpmin = array(5,4); // Minimum version of PHP required by module - $this->need_dolibarr_version = array(10,0); // Minimum version of Dolibarr required by module - $this->warnings_activation = array(); // Warning to show when we activate module. array('always'='text') or array('FR'='textfr','ES'='textes'...) - $this->warnings_activation_ext = array(); // Warning to show when we activate an external module. array('always'='text') or array('FR'='textfr','ES'='textes'...) - //$this->automatic_activation = array('FR'=>'sendrecurringinvoicebymailWasAutomaticallyActivatedBecauseOfYourCountryChoice'); - //$this->always_enabled = true; // If true, can't be disabled + // Dependencies + $this->hidden = false; // A condition to hide module + $this->depends = array('modFacture'); // List of module class names as string that must be enabled if this module is enabled. Example: array('always1'=>'modModuleToEnable1','always2'=>'modModuleToEnable2', 'FR1'=>'modModuleToEnableFR'...) + $this->requiredby = array(); // List of module class names as string to disable if this one is disabled. Example: array('modModuleToDisable1', ...) + $this->conflictwith = array(); // List of module class names as string this module is in conflict with. Example: array('modModuleToDisable1', ...) + $this->langfiles = array("sendrecurringinvoicebymail@sendrecurringinvoicebymail"); + //$this->phpmin = array(5,4); // Minimum version of PHP required by module + $this->need_dolibarr_version = array(10,0); // Minimum version of Dolibarr required by module + $this->warnings_activation = array(); // Warning to show when we activate module. array('always'='text') or array('FR'='textfr','ES'='textes'...) + $this->warnings_activation_ext = array(); // Warning to show when we activate an external module. array('always'='text') or array('FR'='textfr','ES'='textes'...) + //$this->automatic_activation = array('FR'=>'sendrecurringinvoicebymailWasAutomaticallyActivatedBecauseOfYourCountryChoice'); + //$this->always_enabled = true; // If true, can't be disabled - // Constants - // List of particular constants to add when module is enabled (key, 'chaine', value, desc, visible, 'current' or 'allentities', deleteonunactive) - // Example: $this->const=array(0=>array('SENDRECURRINGINVOICEBYMAIL_MYNEWCONST1','chaine','myvalue','This is a constant to add',1), - // 1=>array('SENDRECURRINGINVOICEBYMAIL_MYNEWCONST2','chaine','myvalue','This is another constant to add',0, 'current', 1) - // ); - $this->const = array( - //1=>array('SENDRECURRINGINVOICEBYMAIL_MYCONSTANT', 'chaine', 'avalue', 'This is a constant to add', 1, 'allentities', 1) - ); + // Constants + // List of particular constants to add when module is enabled (key, 'chaine', value, desc, visible, 'current' or 'allentities', deleteonunactive) + // Example: $this->const=array(0=>array('SENDRECURRINGINVOICEBYMAIL_MYNEWCONST1','chaine','myvalue','This is a constant to add',1), + // 1=>array('SENDRECURRINGINVOICEBYMAIL_MYNEWCONST2','chaine','myvalue','This is another constant to add',0, 'current', 1) + // ); + $this->const = array( + //1=>array('SENDRECURRINGINVOICEBYMAIL_MYCONSTANT', 'chaine', 'avalue', 'This is a constant to add', 1, 'allentities', 1) + ); - // Some keys to add into the overwriting translation tables - /*$this->overwrite_translation = array( - 'en_US:ParentCompany'=>'Parent company or reseller', - 'fr_FR:ParentCompany'=>'Maison mère ou revendeur' - )*/ + // Some keys to add into the overwriting translation tables + /*$this->overwrite_translation = array( + 'en_US:ParentCompany'=>'Parent company or reseller', + 'fr_FR:ParentCompany'=>'Maison mère ou revendeur' + )*/ - if (! isset($conf->sendrecurringinvoicebymail) || ! isset($conf->sendrecurringinvoicebymail->enabled)) - { - $conf->sendrecurringinvoicebymail=new stdClass(); - $conf->sendrecurringinvoicebymail->enabled=0; - } + if (! isset($conf->sendrecurringinvoicebymail) || ! isset($conf->sendrecurringinvoicebymail->enabled)) + { + $conf->sendrecurringinvoicebymail=new stdClass(); + $conf->sendrecurringinvoicebymail->enabled=0; + } - // Array to add new pages in new tabs + // Array to add new pages in new tabs $this->tabs = array(); - // Example: - // $this->tabs[] = array('data'=>'objecttype:+tabname1:Title1:mylangfile@sendrecurringinvoicebymail:$user->rights->sendrecurringinvoicebymail->read:/sendrecurringinvoicebymail/mynewtab1.php?id=__ID__'); // To add a new tab identified by code tabname1 - // $this->tabs[] = array('data'=>'objecttype:+tabname2:SUBSTITUTION_Title2:mylangfile@sendrecurringinvoicebymail:$user->rights->othermodule->read:/sendrecurringinvoicebymail/mynewtab2.php?id=__ID__', // To add another new tab identified by code tabname2. Label will be result of calling all substitution functions on 'Title2' key. - // $this->tabs[] = array('data'=>'objecttype:-tabname:NU:conditiontoremove'); // To remove an existing tab identified by code tabname + $this->tabs[] = array('data'=>'invoice-rec:+sendrecurringinvoicebymail:SendingByMail:sendrecurringinvoicebymail@sendrecurringinvoicebymail:sendrecurringinvoicebymail/fiche-rec-tab1.php?id=__ID__'); // To add a new tab identified by code tabname1 + // Example: + // $this->tabs[] = array('data'=>'objecttype:+tabname1:Title1:mylangfile@sendrecurringinvoicebymail:$user->rights->sendrecurringinvoicebymail->read:/sendrecurringinvoicebymail/mynewtab1.php?id=__ID__'); // To add a new tab identified by code tabname1 + // $this->tabs[] = array('data'=>'objecttype:+tabname2:SUBSTITUTION_Title2:mylangfile@sendrecurringinvoicebymail:$user->rights->othermodule->read:/sendrecurringinvoicebymail/mynewtab2.php?id=__ID__', // To add another new tab identified by code tabname2. Label will be result of calling all substitution functions on 'Title2' key. + // $this->tabs[] = array('data'=>'objecttype:-tabname:NU:conditiontoremove'); // To remove an existing tab identified by code tabname // // Where objecttype can be - // 'categories_x' to add a tab in category view (replace 'x' by type of category (0=product, 1=supplier, 2=customer, 3=member) - // 'contact' to add a tab in contact view - // 'contract' to add a tab in contract view - // 'group' to add a tab in group view - // 'intervention' to add a tab in intervention view - // 'invoice' to add a tab in customer invoice view - // 'invoice_supplier' to add a tab in supplier invoice view - // 'member' to add a tab in fundation member view - // 'opensurveypoll' to add a tab in opensurvey poll view - // 'order' to add a tab in customer order view - // 'order_supplier' to add a tab in supplier order view - // 'payment' to add a tab in payment view - // 'payment_supplier' to add a tab in supplier payment view - // 'product' to add a tab in product view - // 'propal' to add a tab in propal view - // 'project' to add a tab in project view - // 'stock' to add a tab in stock view - // 'thirdparty' to add a tab in third party view - // 'user' to add a tab in user view + // 'categories_x' to add a tab in category view (replace 'x' by type of category (0=product, 1=supplier, 2=customer, 3=member) + // 'contact' to add a tab in contact view + // 'contract' to add a tab in contract view + // 'group' to add a tab in group view + // 'intervention' to add a tab in intervention view + // 'invoice' to add a tab in customer invoice view + // 'invoice_supplier' to add a tab in supplier invoice view + // 'member' to add a tab in fundation member view + // 'opensurveypoll' to add a tab in opensurvey poll view + // 'order' to add a tab in customer order view + // 'order_supplier' to add a tab in supplier order view + // 'payment' to add a tab in payment view + // 'payment_supplier' to add a tab in supplier payment view + // 'product' to add a tab in product view + // 'propal' to add a tab in propal view + // 'project' to add a tab in project view + // 'stock' to add a tab in stock view + // 'thirdparty' to add a tab in third party view + // 'user' to add a tab in user view // Dictionaries - $this->dictionaries=array(); + $this->dictionaries=array(); /* Example: $this->dictionaries=array( 'langs'=>'mylangfile@sendrecurringinvoicebymail', - 'tabname'=>array(MAIN_DB_PREFIX."table1",MAIN_DB_PREFIX."table2",MAIN_DB_PREFIX."table3"), // List of tables we want to see into dictonnary editor - 'tablib'=>array("Table1","Table2","Table3"), // Label of tables - 'tabsql'=>array('SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'table1 as f','SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'table2 as f','SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'table3 as f'), // Request to select fields - 'tabsqlsort'=>array("label ASC","label ASC","label ASC"), // Sort order - 'tabfield'=>array("code,label","code,label","code,label"), // List of fields (result of select to show dictionary) - 'tabfieldvalue'=>array("code,label","code,label","code,label"), // List of fields (list of fields to edit a record) - 'tabfieldinsert'=>array("code,label","code,label","code,label"), // List of fields (list of fields for insert) - 'tabrowid'=>array("rowid","rowid","rowid"), // Name of columns with primary key (try to always name it 'rowid') - 'tabcond'=>array($conf->sendrecurringinvoicebymail->enabled,$conf->sendrecurringinvoicebymail->enabled,$conf->sendrecurringinvoicebymail->enabled) // Condition to show each dictionary + 'tabname'=>array(MAIN_DB_PREFIX."table1",MAIN_DB_PREFIX."table2",MAIN_DB_PREFIX."table3"), // List of tables we want to see into dictonnary editor + 'tablib'=>array("Table1","Table2","Table3"), // Label of tables + 'tabsql'=>array('SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'table1 as f','SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'table2 as f','SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'table3 as f'), // Request to select fields + 'tabsqlsort'=>array("label ASC","label ASC","label ASC"), // Sort order + 'tabfield'=>array("code,label","code,label","code,label"), // List of fields (result of select to show dictionary) + 'tabfieldvalue'=>array("code,label","code,label","code,label"), // List of fields (list of fields to edit a record) + 'tabfieldinsert'=>array("code,label","code,label","code,label"), // List of fields (list of fields for insert) + 'tabrowid'=>array("rowid","rowid","rowid"), // Name of columns with primary key (try to always name it 'rowid') + 'tabcond'=>array($conf->sendrecurringinvoicebymail->enabled,$conf->sendrecurringinvoicebymail->enabled,$conf->sendrecurringinvoicebymail->enabled) // Condition to show each dictionary ); */ // Boxes/Widgets - // Add here list of php file(s) stored in sendrecurringinvoicebymail/core/boxes that contains class to show a widget. + // Add here list of php file(s) stored in sendrecurringinvoicebymail/core/boxes that contains class to show a widget. $this->boxes = array( - //0=>array('file'=>'sendrecurringinvoicebymailwidget1.php@sendrecurringinvoicebymail','note'=>'Widget provided by sendrecurringinvoicebymail','enabledbydefaulton'=>'Home'), - //1=>array('file'=>'sendrecurringinvoicebymailwidget2.php@sendrecurringinvoicebymail','note'=>'Widget provided by sendrecurringinvoicebymail'), - //2=>array('file'=>'sendrecurringinvoicebymailwidget3.php@sendrecurringinvoicebymail','note'=>'Widget provided by sendrecurringinvoicebymail') + //0=>array('file'=>'sendrecurringinvoicebymailwidget1.php@sendrecurringinvoicebymail','note'=>'Widget provided by sendrecurringinvoicebymail','enabledbydefaulton'=>'Home'), + //1=>array('file'=>'sendrecurringinvoicebymailwidget2.php@sendrecurringinvoicebymail','note'=>'Widget provided by sendrecurringinvoicebymail'), + //2=>array('file'=>'sendrecurringinvoicebymailwidget3.php@sendrecurringinvoicebymail','note'=>'Widget provided by sendrecurringinvoicebymail') ); - // Cronjobs (List of cron jobs entries to add when module is enabled) - // unit_frequency must be 60 for minute, 3600 for hour, 86400 for day, 604800 for week - $this->cronjobs = array( - //0=>array('label'=>'MyJob label', 'jobtype'=>'method', 'class'=>'/sendrecurringinvoicebymail/class/myobject.class.php', 'objectname'=>'MyObject', 'method'=>'doScheduledJob', 'parameters'=>'', 'comment'=>'Comment', 'frequency'=>2, 'unitfrequency'=>3600, 'status'=>0, 'test'=>'$conf->sendrecurringinvoicebymail->enabled', 'priority'=>50) - ); - // Example: $this->cronjobs=array(0=>array('label'=>'My label', 'jobtype'=>'method', 'class'=>'/dir/class/file.class.php', 'objectname'=>'MyClass', 'method'=>'myMethod', 'parameters'=>'param1, param2', 'comment'=>'Comment', 'frequency'=>2, 'unitfrequency'=>3600, 'status'=>0, 'test'=>'$conf->sendrecurringinvoicebymail->enabled', 'priority'=>50), - // 1=>array('label'=>'My label', 'jobtype'=>'command', 'command'=>'', 'parameters'=>'param1, param2', 'comment'=>'Comment', 'frequency'=>1, 'unitfrequency'=>3600*24, 'status'=>0, 'test'=>'$conf->sendrecurringinvoicebymail->enabled', 'priority'=>50) - // ); + // Cronjobs (List of cron jobs entries to add when module is enabled) + // unit_frequency must be 60 for minute, 3600 for hour, 86400 for day, 604800 for week + $this->cronjobs = array( + //0=>array('label'=>'MyJob label', 'jobtype'=>'method', 'class'=>'/sendrecurringinvoicebymail/class/myobject.class.php', 'objectname'=>'MyObject', 'method'=>'doScheduledJob', 'parameters'=>'', 'comment'=>'Comment', 'frequency'=>2, 'unitfrequency'=>3600, 'status'=>0, 'test'=>'$conf->sendrecurringinvoicebymail->enabled', 'priority'=>50) + ); + // Example: $this->cronjobs=array(0=>array('label'=>'My label', 'jobtype'=>'method', 'class'=>'/dir/class/file.class.php', 'objectname'=>'MyClass', 'method'=>'myMethod', 'parameters'=>'param1, param2', 'comment'=>'Comment', 'frequency'=>2, 'unitfrequency'=>3600, 'status'=>0, 'test'=>'$conf->sendrecurringinvoicebymail->enabled', 'priority'=>50), + // 1=>array('label'=>'My label', 'jobtype'=>'command', 'command'=>'', 'parameters'=>'param1, param2', 'comment'=>'Comment', 'frequency'=>1, 'unitfrequency'=>3600*24, 'status'=>0, 'test'=>'$conf->sendrecurringinvoicebymail->enabled', 'priority'=>50) + // ); - // Permissions - $this->rights = array(); // Permission array used by this module - /* - $r=0; - $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) - $this->rights[$r][1] = 'Read myobject of sendrecurringinvoicebymail'; // Permission label - $this->rights[$r][3] = 1; // Permission by default for new user (0/1) - $this->rights[$r][4] = 'read'; // In php code, permission will be checked by test if ($user->rights->sendrecurringinvoicebymail->level1->level2) - $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->sendrecurringinvoicebymail->level1->level2) + // Permissions + $this->rights = array(); // Permission array used by this module + /* + $r=0; + $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) + $this->rights[$r][1] = 'Read myobject of sendrecurringinvoicebymail'; // Permission label + $this->rights[$r][3] = 1; // Permission by default for new user (0/1) + $this->rights[$r][4] = 'read'; // In php code, permission will be checked by test if ($user->rights->sendrecurringinvoicebymail->level1->level2) + $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->sendrecurringinvoicebymail->level1->level2) - $r++; - $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) - $this->rights[$r][1] = 'Create/Update myobject of sendrecurringinvoicebymail'; // Permission label - $this->rights[$r][3] = 1; // Permission by default for new user (0/1) - $this->rights[$r][4] = 'write'; // In php code, permission will be checked by test if ($user->rights->sendrecurringinvoicebymail->level1->level2) - $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->sendrecurringinvoicebymail->level1->level2) + $r++; + $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) + $this->rights[$r][1] = 'Create/Update myobject of sendrecurringinvoicebymail'; // Permission label + $this->rights[$r][3] = 1; // Permission by default for new user (0/1) + $this->rights[$r][4] = 'write'; // In php code, permission will be checked by test if ($user->rights->sendrecurringinvoicebymail->level1->level2) + $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->sendrecurringinvoicebymail->level1->level2) - $r++; - $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) - $this->rights[$r][1] = 'Delete myobject of sendrecurringinvoicebymail'; // Permission label - $this->rights[$r][3] = 1; // Permission by default for new user (0/1) - $this->rights[$r][4] = 'delete'; // In php code, permission will be checked by test if ($user->rights->sendrecurringinvoicebymail->level1->level2) - $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->sendrecurringinvoicebymail->level1->level2) - */ + $r++; + $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) + $this->rights[$r][1] = 'Delete myobject of sendrecurringinvoicebymail'; // Permission label + $this->rights[$r][3] = 1; // Permission by default for new user (0/1) + $this->rights[$r][4] = 'delete'; // In php code, permission will be checked by test if ($user->rights->sendrecurringinvoicebymail->level1->level2) + $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->sendrecurringinvoicebymail->level1->level2) + */ - // Main menu entries - $this->menu = array(); // List of menus to add - $r=0; + // Main menu entries + $this->menu = array(); // List of menus to add + $r=0; - // Add here entries to declare new menus + // Add here entries to declare new menus - /* BEGIN MODULEBUILDER TOPMENU */ - /* - $this->menu[$r++]=array('fk_menu'=>'', // '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode - 'type'=>'top', // This is a Top menu entry - 'titre'=>'sendrecurringinvoicebymail', - 'mainmenu'=>'sendrecurringinvoicebymail', - 'leftmenu'=>'', - 'url'=>'/sendrecurringinvoicebymail/sendrecurringinvoicebymailindex.php', - 'langs'=>'sendrecurringinvoicebymail@sendrecurringinvoicebymail', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. - 'position'=>1000+$r, - 'enabled'=>'$conf->sendrecurringinvoicebymail->enabled', // Define condition to show or hide menu entry. Use '$conf->sendrecurringinvoicebymail->enabled' if entry must be visible if module is enabled. - 'perms'=>'1', // Use 'perms'=>'$user->rights->sendrecurringinvoicebymail->level1->level2' if you want your menu with a permission rules - 'target'=>'', - 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both - */ + /* BEGIN MODULEBUILDER TOPMENU */ + /* + $this->menu[$r++]=array('fk_menu'=>'', // '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode + 'type'=>'top', // This is a Top menu entry + 'titre'=>'sendrecurringinvoicebymail', + 'mainmenu'=>'sendrecurringinvoicebymail', + 'leftmenu'=>'', + 'url'=>'/sendrecurringinvoicebymail/sendrecurringinvoicebymailindex.php', + 'langs'=>'sendrecurringinvoicebymail@sendrecurringinvoicebymail', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. + 'position'=>1000+$r, + 'enabled'=>'$conf->sendrecurringinvoicebymail->enabled', // Define condition to show or hide menu entry. Use '$conf->sendrecurringinvoicebymail->enabled' if entry must be visible if module is enabled. + 'perms'=>'1', // Use 'perms'=>'$user->rights->sendrecurringinvoicebymail->level1->level2' if you want your menu with a permission rules + 'target'=>'', + 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both + */ - /* END MODULEBUILDER TOPMENU */ + /* END MODULEBUILDER TOPMENU */ - /* BEGIN MODULEBUILDER LEFTMENU MYOBJECT - $this->menu[$r++]=array( 'fk_menu'=>'fk_mainmenu=sendrecurringinvoicebymail', // '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode - 'type'=>'left', // This is a Left menu entry - 'titre'=>'List MyObject', - 'mainmenu'=>'sendrecurringinvoicebymail', - 'leftmenu'=>'sendrecurringinvoicebymail_myobject_list', - 'url'=>'/sendrecurringinvoicebymail/myobject_list.php', - 'langs'=>'sendrecurringinvoicebymail@sendrecurringinvoicebymail', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. - 'position'=>1000+$r, - 'enabled'=>'$conf->sendrecurringinvoicebymail->enabled', // Define condition to show or hide menu entry. Use '$conf->sendrecurringinvoicebymail->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected. - 'perms'=>'1', // Use 'perms'=>'$user->rights->sendrecurringinvoicebymail->level1->level2' if you want your menu with a permission rules - 'target'=>'', - 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both - $this->menu[$r++]=array( 'fk_menu'=>'fk_mainmenu=sendrecurringinvoicebymail,fk_leftmenu=sendrecurringinvoicebymail', // '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode - 'type'=>'left', // This is a Left menu entry - 'titre'=>'New MyObject', - 'mainmenu'=>'sendrecurringinvoicebymail', - 'leftmenu'=>'sendrecurringinvoicebymail_myobject_new', - 'url'=>'/sendrecurringinvoicebymail/myobject_page.php?action=create', - 'langs'=>'sendrecurringinvoicebymail@sendrecurringinvoicebymail', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. - 'position'=>1000+$r, - 'enabled'=>'$conf->sendrecurringinvoicebymail->enabled', // Define condition to show or hide menu entry. Use '$conf->sendrecurringinvoicebymail->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected. - 'perms'=>'1', // Use 'perms'=>'$user->rights->sendrecurringinvoicebymail->level1->level2' if you want your menu with a permission rules - 'target'=>'', - 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both - END MODULEBUILDER LEFTMENU MYOBJECT */ + /* BEGIN MODULEBUILDER LEFTMENU MYOBJECT + $this->menu[$r++]=array( 'fk_menu'=>'fk_mainmenu=sendrecurringinvoicebymail', // '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode + 'type'=>'left', // This is a Left menu entry + 'titre'=>'List MyObject', + 'mainmenu'=>'sendrecurringinvoicebymail', + 'leftmenu'=>'sendrecurringinvoicebymail_myobject_list', + 'url'=>'/sendrecurringinvoicebymail/myobject_list.php', + 'langs'=>'sendrecurringinvoicebymail@sendrecurringinvoicebymail', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. + 'position'=>1000+$r, + 'enabled'=>'$conf->sendrecurringinvoicebymail->enabled', // Define condition to show or hide menu entry. Use '$conf->sendrecurringinvoicebymail->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected. + 'perms'=>'1', // Use 'perms'=>'$user->rights->sendrecurringinvoicebymail->level1->level2' if you want your menu with a permission rules + 'target'=>'', + 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both + $this->menu[$r++]=array( 'fk_menu'=>'fk_mainmenu=sendrecurringinvoicebymail,fk_leftmenu=sendrecurringinvoicebymail', // '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode + 'type'=>'left', // This is a Left menu entry + 'titre'=>'New MyObject', + 'mainmenu'=>'sendrecurringinvoicebymail', + 'leftmenu'=>'sendrecurringinvoicebymail_myobject_new', + 'url'=>'/sendrecurringinvoicebymail/myobject_page.php?action=create', + 'langs'=>'sendrecurringinvoicebymail@sendrecurringinvoicebymail', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. + 'position'=>1000+$r, + 'enabled'=>'$conf->sendrecurringinvoicebymail->enabled', // Define condition to show or hide menu entry. Use '$conf->sendrecurringinvoicebymail->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected. + 'perms'=>'1', // Use 'perms'=>'$user->rights->sendrecurringinvoicebymail->level1->level2' if you want your menu with a permission rules + 'target'=>'', + 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both + END MODULEBUILDER LEFTMENU MYOBJECT */ - // Exports - $r=1; + // Exports + $r=1; - /* BEGIN MODULEBUILDER EXPORT MYOBJECT */ - /* - $langs->load("sendrecurringinvoicebymail@sendrecurringinvoicebymail"); - $this->export_code[$r]=$this->rights_class.'_'.$r; - $this->export_label[$r]='MyObjectLines'; // Translation key (used only if key ExportDataset_xxx_z not found) - $this->export_icon[$r]='myobject@sendrecurringinvoicebymail'; - $keyforclass = 'MyObject'; $keyforclassfile='/mymobule/class/myobject.class.php'; $keyforelement='myobject'; - include DOL_DOCUMENT_ROOT.'/core/commonfieldsinexport.inc.php'; - $keyforselect='myobject'; $keyforaliasextra='extra'; $keyforelement='myobject'; - include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php'; - //$this->export_dependencies_array[$r]=array('mysubobject'=>'ts.rowid', 't.myfield'=>array('t.myfield2','t.myfield3')); // To force to activate one or several fields if we select some fields that need same (like to select a unique key if we ask a field of a child to avoid the DISTINCT to discard them, or for computed field than need several other fields) - $this->export_sql_start[$r]='SELECT DISTINCT '; - $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'myobject as t'; - $this->export_sql_end[$r] .=' WHERE 1 = 1'; - $this->export_sql_end[$r] .=' AND t.entity IN ('.getEntity('myobject').')'; - $r++; */ - /* END MODULEBUILDER EXPORT MYOBJECT */ - } + /* BEGIN MODULEBUILDER EXPORT MYOBJECT */ + /* + $langs->load("sendrecurringinvoicebymail@sendrecurringinvoicebymail"); + $this->export_code[$r]=$this->rights_class.'_'.$r; + $this->export_label[$r]='MyObjectLines'; // Translation key (used only if key ExportDataset_xxx_z not found) + $this->export_icon[$r]='myobject@sendrecurringinvoicebymail'; + $keyforclass = 'MyObject'; $keyforclassfile='/mymobule/class/myobject.class.php'; $keyforelement='myobject'; + include DOL_DOCUMENT_ROOT.'/core/commonfieldsinexport.inc.php'; + $keyforselect='myobject'; $keyforaliasextra='extra'; $keyforelement='myobject'; + include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php'; + //$this->export_dependencies_array[$r]=array('mysubobject'=>'ts.rowid', 't.myfield'=>array('t.myfield2','t.myfield3')); // To force to activate one or several fields if we select some fields that need same (like to select a unique key if we ask a field of a child to avoid the DISTINCT to discard them, or for computed field than need several other fields) + $this->export_sql_start[$r]='SELECT DISTINCT '; + $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'myobject as t'; + $this->export_sql_end[$r] .=' WHERE 1 = 1'; + $this->export_sql_end[$r] .=' AND t.entity IN ('.getEntity('myobject').')'; + $r++; */ + /* END MODULEBUILDER EXPORT MYOBJECT */ + } - /** - * Function called when module is enabled. - * The init function add constants, boxes, permissions and menus (defined in constructor) into Dolibarr database. - * It also creates data directories - * - * @param string $options Options when enabling module ('', 'noboxes') - * @return int 1 if OK, 0 if KO - */ - public function init($options='') - { - $sql = array(); + /** + * Function called when module is enabled. + * The init function add constants, boxes, permissions and menus (defined in constructor) into Dolibarr database. + * It also creates data directories + * + * @param string $options Options when enabling module ('', 'noboxes') + * @return int 1 if OK, 0 if KO + */ + public function init($options='') + { + // Launch SQL files + $result=$this->_load_tables('/' . basename(dirname(dirname(dirname(__FILE__)))) . '/sql/'); + if ($result < 0) return -1; // Do not activate module if error 'not allowed' returned when loading module SQL queries (the _load_table run sql with run_sql with the error allowed parameter set to 'default') - // we check if our model already exists - $result = $this->db->query("SELECT COUNT(*) AS cpt FROM " . MAIN_DB_PREFIX."c_email_templates WHERE module = 'sendrecurringinvoicebymail'"); - if ($result) { - $row = $this->db->fetch_object($result); - if ($row->cpt == 0) { - $sql[] = "INSERT INTO " . MAIN_DB_PREFIX."c_email_templates - (module, type_template, lang, label, joinfiles, topic, content) - VALUES ( - 'sendrecurringinvoicebymail', - 'facture_send', - '', - 'SendRecurringInvoiceByMail : original template', - '1', - '[__MYCOMPANY_NAME__] __(NewBill)__ __REF__', - '__(Hello)__,\n\nPlease find attached your new invoice.\n\nIn case of payment via bank transfer (our bank infos added at the bottom of the invoice), remember to add some references :\n- invoice number __REF__ for a one-time transfer,\n- or the contract/subscription reference __CONTRACT_REF__ for periodic transfers.\n\n__(Sincerely)__,\n\n__MYCOMPANY_NAME__')"; - } - } + // Launch small and conditional SQL queries + $sql = array(); + // we check if our model already exists + $result = $this->db->query("SELECT COUNT(*) AS cpt FROM " . MAIN_DB_PREFIX . "c_email_templates WHERE module = 'sendrecurringinvoicebymail'"); + if ($result) { + $row = $this->db->fetch_object($result); + if ($row->cpt == 0) { + $sql[] = "INSERT INTO " . MAIN_DB_PREFIX."c_email_templates + (module, type_template, lang, label, joinfiles, topic, content) + VALUES ( + 'sendrecurringinvoicebymail', + 'facture_send', + '', + 'SendRecurringInvoiceByMail : original template', + '1', + '[__MYCOMPANY_NAME__] __(NewBill)__ __REF__', + '__(Hello)__,\n\nPlease find attached your new invoice.\n\nIn case of payment via bank transfer (our bank infos added at the bottom of the invoice), remember to add some references :\n- invoice number __REF__ for a one-time transfer,\n- or the contract/subscription reference __CONTRACT_REF__ for periodic transfers.\n\n__(Sincerely)__,\n\n__MYCOMPANY_NAME__')"; + } + } - return $this->_init($sql, $options); - } + // Reactivate the template in case the module has been + // uninstalled which should have disabled the template. + $sql[] = "UPDATE " . MAIN_DB_PREFIX . "c_email_templates SET enabled = 1 WHERE module = 'sendrecurringinvoicebymail'"; - /** - * Function called when module is disabled. - * Remove from database constants, boxes and permissions from Dolibarr database. - * Data directories are not deleted - * - * @param string $options Options when enabling module ('', 'noboxes') - * @return int 1 if OK, 0 if KO - */ - public function remove($options = '') - { - $sql = array(); + // Cleaning up old (and ugly) system which + // used note_private to store overriding data. + // TODO : Remove this block at next version. + $result = $this->db->query("SELECT r.rowid AS rid, r.note_private, s.rowid AS sid FROM " . MAIN_DB_PREFIX . "facture_rec AS r LEFT JOIN " . MAIN_DB_PREFIX . "sribm_custom_mail_info AS s ON r.rowid = s.fk_facture_rec WHERE r.note_private LIKE '%sendrecurringinvoicebymail::%'"); + if ($result) { + while($row = $this->db->fetch_object($result)) { + $mail_data = $this->parseCustomFieldsMail($row->note_private); + $sid = $row->sid; + if (! $sid) { + $this->db->query("INSERT INTO " . MAIN_DB_PREFIX . "sribm_custom_mail_info (fk_facture_rec) VALUES (" . (int)$row->rid . ")"); + $sid = $this->db->last_insert_id(MAIN_DB_PREFIX . 'sribm_custom_mail_info'); + } + foreach (array('subject' => 'subject', 'body' => 'body_plaintext', 'sendto' => 'sendto_free') as $key => $item) { + if (! empty($mail_data[$key])) { + // We loop on each field. + // Not optimized, I know. + $this->db->query("UPDATE " . MAIN_DB_PREFIX . "sribm_custom_mail_info SET " . $item . " = '" . $this->db->escape($mail_data[$key]) . "' WHERE rowid = " . (int)$sid); + if ($key == 'sendto') { + // If the note_private specified a recipient, we disable sending to the + // main societe's mail. + $this->db->query("UPDATE " . MAIN_DB_PREFIX . "sribm_custom_mail_info SET sendto_thirdparty = 0 WHERE rowid = " . (int)$row->rid); + } + } + } + $regexps = array( + '/%%% sendrecurringinvoicebymail::subject.*%%%/sU', + '/%%% sendrecurringinvoicebymail::body.*%%%/sU', + '/%%% sendrecurringinvoicebymail::sendto.*%%%/sU', + ); + $row->note_private = preg_replace($regexps, array('', '', ''), $row->note_private); + $this->db->query("UPDATE " . MAIN_DB_PREFIX . "facture_rec SET note_private = '" . $this->db->escape($row->note_private) . "' WHERE rowid = " . (int)$row->rid); + } + } - $sql[] = "DELETE FROM " . MAIN_DB_PREFIX."c_email_templates WHERE module = 'sendrecurringinvoicebymail'"; + return $this->_init($sql, $options); + } + + /** + * Function called when module is disabled. + * Remove from database constants, boxes and permissions from Dolibarr database. + * Data directories are not deleted + * + * @param string $options Options when enabling module ('', 'noboxes') + * @return int 1 if OK, 0 if KO + */ + public function remove($options = '') + { + $sql = array(); + + // Disable the template + // (instead of deleting it, which may cause unwanted work loss) + // (Yeah, counterside is data bloat... sorry...) + $sql[] = "UPDATE " . MAIN_DB_PREFIX . "c_email_templates SET enabled = 0 WHERE module = 'sendrecurringinvoicebymail'"; + + return $this->_remove($sql, $options); + } + + /** + * FIXME: Obsolete. Replaced by SRIBMCustomMailInfo. To be removed. + * For the time being, we abuse of note_private to store our customizations + * + * This expect something like this in note_private: + * This is a good client... (other private infos) + * %%% sendrecurringinvoicebymail::subject + * New invoice __REF__ + * %%% + * %%% sendrecurringinvoicebymail::sendto + * recipient1@example.org, recipient2@example.org + * %%% + * %%% sendrecurringinvoicebymail::body + * Hello dear client, + * Please find attached... + * %%% + */ + public function parseCustomFieldsMail($data) + { + $output = []; + + // Remove eventual windows' "\r" + $data = str_replace("\r", "", $data); + + $regexps = array( + 'subject' => '/(^|\n)%%% sendrecurringinvoicebymail::subject\n(?.*)%%%(\n|$)/sU', + 'body' => '/(^|\n)%%% sendrecurringinvoicebymail::body\n(?.*)%%%(\n|$)/sU', + 'sendto' => '/(^|\n)%%% sendrecurringinvoicebymail::sendto\n(?.*)%%%(\n|$)/sU', + ); + foreach ($regexps as $key => $r) { + $result_regexp = []; + if (preg_match_all($r, $data, $result_regexp)) { + $output[$key] = trim($result_regexp[$key][0]); + } + } + + return $output; + } - return $this->_remove($sql, $options); - } } diff --git a/fiche-rec-tab1.php b/fiche-rec-tab1.php new file mode 100644 index 0000000..efc57ec --- /dev/null +++ b/fiche-rec-tab1.php @@ -0,0 +1,326 @@ + + * Copyright (C) 2021 Chl + * + * 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 . + */ + +// Initially copied from modulebuilder/template/myobject_card.php + +// Load Dolibarr environment +$res=0; +// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) +if (! $res && ! empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) $res=@include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; +// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME +$tmp=empty($_SERVER['SCRIPT_FILENAME'])?'':$_SERVER['SCRIPT_FILENAME'];$tmp2=realpath(__FILE__); $i=strlen($tmp)-1; $j=strlen($tmp2)-1; +while($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i]==$tmp2[$j]) { $i--; $j--; } +if (! $res && $i > 0 && file_exists(substr($tmp, 0, ($i+1))."/main.inc.php")) $res=@include substr($tmp, 0, ($i+1))."/main.inc.php"; +if (! $res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i+1)))."/main.inc.php")) $res=@include dirname(substr($tmp, 0, ($i+1)))."/main.inc.php"; +// Try main.inc.php using relative path +if (! $res && file_exists("../main.inc.php")) $res=@include "../main.inc.php"; +if (! $res && file_exists("../../main.inc.php")) $res=@include "../../main.inc.php"; +if (! $res && file_exists("../../../main.inc.php")) $res=@include "../../../main.inc.php"; +if (! $res) die("Include of main fails"); + +// Load needed classes/lib +require_once DOL_DOCUMENT_ROOT . '/compta/facture/class/facture-rec.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/lib/invoice.lib.php'; +require_once 'class/sribmcustommailinfo.class.php'; + +// Get parameters +$id = GETPOST('id', 'int'); +$output = ''; + +// Check security (take care of everything, even page layout, if something goes wrong) +restrictedArea($user, 'facture', $id, 'facture_rec'); + +// Load translation files required by the page +$langs->loadLangs(array('bills', 'compta', 'other', 'mails', 'products', 'companies', 'sendrecurringinvoicebymail@sendrecurringinvoicebymail')); + +// Wrap everything in a do-while(false) as a try-catch mecanisme +// in order to print llxFooter whatever happens. +do { + /** + * Part 0 : Preparations + */ + + // Load necessary data + $object = new FactureRec($db); + $mailObject = new SRIBMCustomMailInfo($db); + $form = new Form($db); + if ($object->fetch($id) <= 0 or !$object->id) + { + setEventMessages($langs->trans("ErrorRecordNotFound"), null, 'errors'); + break; + } + if ($mailObject->fetch(null, $object->id, true) <= 0) { + setEventMessages("Weird stuff, shouldn't happen : " . $mailObject->error); + break; + } + + // List of senders (user, company, robot, ...) + $listFrom = array(); + $listFrom['robot'] = $conf->global->MAIN_MAIL_EMAIL_FROM; + $listFrom['company'] = $conf->global->MAIN_INFO_SOCIETE_NOM .' <'.$conf->global->MAIN_INFO_SOCIETE_MAIL.'>'; + if (!empty($user->email)) { + $listFrom['user'] = $user->getFullName($langs) . ' <' . $user->email . '>'; + } + // If the address in the SRIBM object is not the same as the user (basically, + // the user has changed its email address or the address has been set by another + // user), we add an 'old' = 'no modification' option. + if ($mailObject->id + && $mailObject->fromtype == 'user' + && isset($listFrom['user']) + && $listFrom['user'] != $mailObject->frommail + ) { + $listFrom['old'] = $mailObject->frommail; + } + + // List of contacts of the third party + $listContacts = $mailObject->fac_rec_object->thirdparty->thirdparty_and_contact_email_array(1); + + // Substitution array/string + $helpforsubstitution = $langs->trans('AvailableVariables').' :
'."\n"; + $tmparray = getCommonSubstitutionArray($langs, 0, null, $object); + complete_substitutions_array($tmparray, $langs); + foreach($tmparray as $key => $val) { + $helpforsubstitution .= $key . ' -> ' . $langs->trans(dol_string_nohtmltag($val)) . '
'; + } + + + /** + * Part 1 : Treatment of form submission + */ + + // If the mail form has been submitted, check and record the data + if (GETPOST('save')) { + do { + // Validate input data + if (! array_key_exists(GETPOST('fromtype', 'alpha'), $listFrom)) { + setEventMessages('Unexpected from value', null, 'errors'); + break; + } + if (GETPOST('sendto_socpeople', 'array') != array_intersect(GETPOST('sendto_socpeople', 'array'), array_keys($listContacts))) { + setEventMessages("Unexpected contact value in 'to'", null, 'errors'); + break; + } + if (GETPOST('sendcc_socpeople', 'array') != array_intersect(GETPOST('sendcc_socpeople', 'array'), array_keys($listContacts))) { + setEventMessages("Unexpected contact value in 'cc'", null, 'errors'); + break; + } + // Validate some non-breaking stuff after feeding + if (empty(GETPOST('sendto_free', 'alpha')) && empty(GETPOST('sendto_socpeople', 'array'))) { + // Kinda weird behaviour from CMailFile but better alert the user beforehand + // FIXME: check if there is a workaround ? + setEventMessages("In some configuration, CMailFile doesn't allow empty 'to' recipient. You should set at least one.", null, 'warnings'); + //break; + } + if (! strlen(GETPOST('subject', 'alpha'))) { + // Kinda weird behaviour from CMailFile but better alert the user beforehand + // FIXME: check if there is a workaround ? + setEventMessages("In some configuration, CMailFile doesn't allow empty subject. You should set one.", null, 'warnings'); + //break; + } + + // Feed the input data to the model + $mailObject->active = GETPOST('active', 'int') ? 1 : 0; + $mailObject->addmaindocfile = GETPOST('addmaindocfile', 'int') ? 1 : 0; + + $mailObject->fromtype = GETPOST('fromtype', 'alpha'); + $mailObject->frommail = $listFrom[$mailObject->fromtype]; + + $mailObject->sendto_free = GETPOST('sendto_free', 'alpha'); + $mailObject->sendto_thirdparty = in_array('thirdparty', GETPOST('sendto_socpeople', 'array')); + + $mailObject->sendcc_free = GETPOST('sendcc_free', 'alpha'); + $mailObject->sendcc_thirdparty = in_array('thirdparty', GETPOST('sendcc_socpeople', 'array')); + + $mailObject->subject = GETPOST('subject', 'alpha'); + $mailObject->body_plaintext = GETPOST('body_plaintext', 'alpha'); + + // Save into database + if ($mailObject->id) { + if ($mailObject->update($user) != 1) { + setEventMessages($langs->trans("ErrorSQL") . ' : ' . $mailObject->error, null, 'errors'); + break; + } + } else { + $mailObject->fk_facture_rec = $object->id; + if ($mailObject->create($user) < 0) { + setEventMessages($langs->trans("ErrorSQL") . ' : ' . $mailObject->error, null, 'errors'); + break; + } + } + // Update the linked contacts + $data = array_merge( + array_map( + function ($id) { return array('id' => $id, 'sendtype' => 'to'); }, + array_filter(GETPOST('sendto_socpeople', 'array'), 'is_numeric') + ), + array_map( + function ($id) { return array('id' => $id, 'sendtype' => 'cc'); }, + array_filter(GETPOST('sendcc_socpeople', 'array'), 'is_numeric') + ) + ); + if ($mailObject->updateLinkSocPeople($data) != 1) { + setEventMessages($langs->trans("ErrorSQL") . ' : ' . $mailObject->error, null, 'errors'); + break; + } + + // Everything seems ok + setEventMessages($langs->trans("CorrectlyUpdated"), null, 'mesgs'); + // ... + redirect to cleanly reload all data and avoid some F5 misbehaviour + header("Location: fiche-rec-tab1.php?id=" . (int) $id, true, 302); + return; + } while(false); + } else if (GETPOST('reset') && $mailObject->id) { + if ($mailObject->delete() == 1) { + // Success message... + setEventMessages($langs->trans("ResetDone"), null, 'mesgs'); + + // ... + redirect to cleanly reload all data + header("Location: fiche-rec-tab1.php?id=" . (int) $id, true, 302); + return; + } else { + setEventMessages($langs->trans("ErrorSQL") . " : " . $mailObject->error , null, 'errors'); + } + } + + // Prepare the pre-selected id for To/Cc select inputs + $preselected = array( + 'to' => array(), + 'cc' => array(), + ); + if (GETPOSTISSET('sendto_socpeople') || GETPOSTISSET('sendcc_socpeople')) { + // Retrieve data from last form submission + $preselected['to'] = GETPOST('sendto_socpeople'); + $preselected['cc'] = GETPOST('sendcc_socpeople'); + } else { + // Retrieve data from model + foreach ($mailObject->linkToSocPeoples as $contact) { + $preselected[$contact->pivot->sendtype][] = $contact->id; + } + // add the third-party's email in case sendXX_thirdparty is true + if ($mailObject->sendto_thirdparty) { + $preselected['to'][] = 'thirdparty'; + } + if ($mailObject->sendcc_thirdparty) { + $preselected['cc'][] = 'thirdparty'; + } + } + + /** + * Part 2 : Display + */ + + // Same tabs than the main page + $head=invoice_rec_prepare_head($object); + $output .= dol_get_fiche_head($head, 'sendrecurringinvoicebymail', $langs->trans("RepeatableInvoice"), -1, 'bill'); // Add a div + $output .= '
' . $mailObject->fac_rec_object->ref . "
\n"; + $output .= '
' . $langs->trans('ThirdParty') . ' : ' . $mailObject->fac_rec_object->thirdparty->getNomUrl(1) . "
\n"; + $output .= "\n\n"; + + $output .= '
' . $langs->trans("Options") . "
\n"; + $output .= '
'; + $output .= ''; + $output .= ''; + $output .= ' \n"; + $output .= ' \n"; + $output .= "\n"; + $output .= "
active || GETPOSTISSET('active')) ? ' checked="checked"' : '') . " />
\n"; + + // Little explanations + $output .= '
' . $langs->trans("CustomizationTitle") . "
\n"; + // TODO: translation + $output .= "

" . $langs->trans('CustomizationIntro', $langs->trans('Reset')) . "
\n"; + $output .= $langs->trans('CustomizationLinkToGlobalTemplate', DOL_URL_ROOT . '/admin/mails_templates.php?search_label=sendrecurring') . "

\n\n"; + + $output .= ''; + $output .= '\n"; + + + // Recipient(s) + $output .= '\n\n"; + + + // CC + $output .= '\n\n"; + + + // Subject + $output .= '\n\n"; + + + // addmaindocfile + $output .= '\n"; + $tmp_addmaindocfile = $mailObject->addmaindocfile; + if (! empty($_POST)) { + $tmp_addmaindocfile = GETPOSTISSET('addmaindocfile') ? 1 : 0; + } + $output .= '\n"; + + + // body_plaintext + $output .= '\n\n"; + + $output .= "
'.$langs->trans("MailFrom").''; + $defaultFrom = 'robot'; + if (isset($listFrom['old'])) { + $defaultFrom = 'old'; + } elseif ($mailObject->id) { + $defaultFrom = $mailObject->fromtype; + } + $output .= $form->selectarray('fromtype', $listFrom, GETPOST('fromtype', 'alpha') ? GETPOST('fromtype', 'alpha') : $defaultFrom); + $output .= "
'; + $output .= $form->textwithpicto($langs->trans("MailTo"), $langs->trans("YouCanUseCommaSeparatorForSeveralRecipients")); + $output .= ""; + $output .= 'sendto_free)) . '" />'; + $output .= " " . $langs->trans("and") . "/" . $langs->trans("or") . " "; + $output .= $form->multiselectarray('sendto_socpeople', $listContacts, $preselected['to']); + $output .= "
'; + $output .= $form->textwithpicto($langs->trans("MailCC"), $langs->trans("YouCanUseCommaSeparatorForSeveralRecipients")); + $output .= ""; + $output .= 'sendcc_free)) . '" />'; + $output .= " " . $langs->trans("and") . "/" . $langs->trans("or") . " "; + $output .= $form->multiselectarray('sendcc_socpeople', $listContacts, $preselected['cc']); + $output .= "
'; + $output .= $form->textwithpicto($langs->trans("MailTopic"), $helpforsubstitution, 1, 'help', '', 0, 2, 'substittooltipfromtopic'); + $output .= ""; + $output .= ''; + $output .= "
' . $langs->trans('MailFile') . " ' . $langs->trans("JoinMainDoc") . "
'; + $output .= $form->textwithpicto($langs->trans("MailText"), $helpforsubstitution, 1, 'help', '', 0, 2, 'substittooltipfrombody'); + $output .= ""; + /* + // doleditor does some weird stuff, adding
and newlines, I'll get more into it when I have time. + // fallback to simple \n"; + $output .= "
\n"; + + $output .= '
'; + $output .= ''; + $output .= 'id ? '' : ' title="' . $langs->trans('ResetTooltipNoCustomisationToReset') . '" disabled="disabled"') . ' />'; + $output .= "
\n"; +} while (false); + +// Print everything +llxHeader('', $langs->trans('RepeatableInvoice') . ' - ' . $langs->trans('SendingByMail'), ''); +print $output; +llxFooter(); diff --git a/img/screenshot1.png b/img/screenshot1.png new file mode 100644 index 0000000000000000000000000000000000000000..53ba700139cbdba34281ef5d118933dba3d88373 GIT binary patch literal 131363 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
`d56q%N1%v}U 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

oOa&RMx1_R@Tpvt2DenBTD;saH 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%0DuyXM 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. +OptionEnable = Send mail when generating via cron (cf. module "Scheduled Jobs") +Reset = Reset +ResetDone = Reset done : customization deleted +ResetTooltipNoCustomisationToReset = No customization to delete. +SendingByMail = Sending by email diff --git a/langs/fr_FR/sendrecurringinvoicebymail.lang b/langs/fr_FR/sendrecurringinvoicebymail.lang index a43e076..1a37c1e 100644 --- a/langs/fr_FR/sendrecurringinvoicebymail.lang +++ b/langs/fr_FR/sendrecurringinvoicebymail.lang @@ -37,12 +37,13 @@ sendrecurringinvoicebymailAbout = À propos de sendrecurringinvoicebymail sendrecurringinvoicebymailAboutPage = Page à propos de sendrecurringinvoicebymail # -# Page d'exemple +# Page de personnalisation par modèle # -MyPageName = Nom de ma page - -# -# Box d'exemple -# -MyWidget = Mon widget -MyWidgetDescription = Description de mon widget +CustomizationTitle = Personnalisation +CustomizationIntro = Ci-dessous, vous pouvez personnaliser les emails pour cette facture-modèle. Pour annuler toute personnalisation, cliquez sur le bouton '%s'. +CustomizationLinkToGlobalTemplate = Pour mémoire, le template global est configurable par ici. +OptionEnable = Envoyer par email lors d'une génération automatique via le module "Travaux planifiés" +Reset = Réinitialiser +ResetDone = Réinitialisation effectuée : personnalisation supprimée. +ResetTooltipNoCustomisationToReset = Aucune personnalisation à supprimer. +SendingByMail = Envoi par courriel diff --git a/sql/data.sql b/sql/data.sql new file mode 100644 index 0000000..720ba96 --- /dev/null +++ b/sql/data.sql @@ -0,0 +1,14 @@ +-- Copyright (C) 2021 Chl +-- +-- 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 . diff --git a/sql/llx_sribm_custom_mail_info.key.sql b/sql/llx_sribm_custom_mail_info.key.sql new file mode 100644 index 0000000..b95e23d --- /dev/null +++ b/sql/llx_sribm_custom_mail_info.key.sql @@ -0,0 +1,29 @@ +-- Copyright (C) 2021 Chl +-- +-- 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/. + + +-- BEGIN MODULEBUILDER INDEXES +--ALTER TABLE llx_mymodule_myobject ADD INDEX idx_fieldobject (fieldobject); +-- END MODULEBUILDER INDEXES + +--ALTER TABLE llx_mymodule_myobject ADD UNIQUE INDEX uk_mymodule_myobject_fieldxy(fieldx, fieldy); + +--ALTER TABLE llx_mymodule_myobject ADD CONSTRAINT llx_mymodule_myobject_fk_field FOREIGN KEY (fk_field) REFERENCES llx_mymodule_myotherobject(rowid); + +ALTER TABLE llx_sribm_custom_mail_info ADD UNIQUE INDEX llx_sribm_custom_mail_info_uniq_frec (fk_facture_rec); +ALTER TABLE llx_sribm_custom_mail_info ADD CONSTRAINT llx_sribm_custom_mail_info_fk_rowid FOREIGN KEY (fk_facture_rec) REFERENCES llx_facture_rec(rowid) ON DELETE CASCADE ON UPDATE CASCADE; + +ALTER TABLE llx_sribm_custom_mail_info_socpeople ADD CONSTRAINT llx_sribm_custom_mail_info_socpeople_c_fk FOREIGN KEY (fk_sribm_cmi) REFERENCES llx_sribm_custom_mail_info(rowid) ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE llx_sribm_custom_mail_info_socpeople ADD CONSTRAINT llx_sribm_custom_mail_info_socpeople_s_fk FOREIGN KEY (fk_socpeople) REFERENCES llx_socpeople(rowid) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/sql/llx_sribm_custom_mail_info.sql b/sql/llx_sribm_custom_mail_info.sql new file mode 100644 index 0000000..188cacd --- /dev/null +++ b/sql/llx_sribm_custom_mail_info.sql @@ -0,0 +1,49 @@ +-- Copyright (C) 2021 Chl +-- +-- 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/. + + +-- Sorry for the schema's complexity, but we have to manage 3 types +-- of recipients : +-- * the email in the societe/company's profile (default for the module) +-- * the contacts (table 'llx_socpeople') +-- * the email from the free text input +-- The From can also be a little difficult since, for the time being, +-- we avoid a free text input for the source email. +CREATE TABLE llx_sribm_custom_mail_info( + rowid INTEGER AUTO_INCREMENT PRIMARY KEY, + fk_facture_rec INTEGER NOT NULL, + active smallint DEFAULT 1 NOT NULL, + addmaindocfile smallint DEFAULT 1 NOT NULL, + fromtype text NOT NULL, + frommail text NOT NULL, + sendto_thirdparty smallint DEFAULT 1 NOT NULL, + sendto_free text, + sendcc_thirdparty smallint DEFAULT 0 NOT NULL, + sendcc_free text, + sendbcc_thirdparty smallint DEFAULT 0 NOT NULL, + sendbcc_free text, + subject text, + body_plaintext mediumtext, + body_html mediumtext +) ENGINE=innodb; + + +-- sendtype should only be one of 'to', 'cc' and 'bcc' but +-- I'm kinda afraid to do an ENUM with Dolibarr black magic on SQL. +CREATE TABLE llx_sribm_custom_mail_info_socpeople( + fk_sribm_cmi INTEGER NOT NULL, + fk_socpeople INTEGER NOT NULL, + sendtype text NOT NULL +) ENGINE=innodb;