Compare commits

..

No commits in common. "master" and "0.3.4" have entirely different histories.

6 changed files with 12 additions and 99 deletions

View file

@ -1,74 +0,0 @@
# Creates a module_sendrecurringinvoicebymail-X.Y.Z.zip file when pushing a tag
#
# This job is mainly useless (Forgejo already creates a usable .zip archive,
# minus the name) and serves more as a warmup for a decent CI/CD tryout.
on:
push:
tags:
# For the time being, we only trigger on the tags clearly matching a
# '1.2.3' version pattern.
- '[0-9]+.[0-9]+.[0-9]+'
env:
MYFILENAME: "module_sendrecurringinvoicebymail-${{ github.ref_name }}"
jobs:
GenerateReleaseZipfile:
runs-on: docker
container:
image: code.bugness.org/chl/alpine-wget-git-zip:latest
steps:
- name: Download the automatic repository archive
run: |
# In case the repository is private, we build an authenticated URL
# with our action token.
MY_GITHUB_AUTHENTICATED_URL="$( echo "$GITHUB_SERVER_URL" | sed "s#^\(https\?://\)#\1$GITHUB_TOKEN\@#" )"
wget -O "$MYFILENAME.zip" "$MY_GITHUB_AUTHENTICATED_URL"/"$GITHUB_REPOSITORY"/archive/"$GITHUB_REF_NAME".zip
- name: A bit of useless cleanup
run: |
#apk add zip
# On Forgejo, GITHUB_REPOSITORY="owner/repo" (and we just want the 'repo' part)
MY_REPOSITORY="$( echo "$GITHUB_REPOSITORY" | sed 's/.*\///' )"
zip -d "$MYFILENAME.zip" \
"$MY_REPOSITORY/.editorconfig" \
"$MY_REPOSITORY/.gitattributes" \
"$MY_REPOSITORY/.gitignore" \
"$MY_REPOSITORY/.tx*"
- name: Upload artifact (using v4)
run: |
set -ex
# The busybox version of wget does not offer --method=PUT as of 2024-08-26
#apk add wget
# We extract the Actions.Results:22:33 from ACTIONS_RUNTIME_TOKEN
# (base64 -d doesn't like when the '==' padding is missing, so 2>/dev/null and relying on the piping to forget about non-zero return code...)
read WORKFLOW_RUN_BACKEND_ID WORKFLOW_JOB_RUN_BACKEND_ID <<EOF
$( echo "$ACTIONS_RUNTIME_TOKEN" | sed 's/.*\.\(.*\)\..*/\1/' | base64 -d 2>/dev/null | sed 's/.*Actions.Results:\([^:]\+\):\([^:" ]\+\).*/\1 \2/' )
EOF
# Get the upload URL
# note: we use the name without .zip, it seems to be added automatically.
RESPONSE="$( wget -O - \
--header 'Content-Type:application/json' \
--header "Authorization: Bearer $GITHUB_TOKEN" \
--post-data "$( printf '{"version":4, "name":"%s", "workflow_run_backend_id":"%s", "workflow_job_run_backend_id":"%s"}' "$MYFILENAME" "$WORKFLOW_RUN_BACKEND_ID" "$WORKFLOW_JOB_RUN_BACKEND_ID" )" \
"$GITHUB_SERVER_URL"/twirp/github.actions.results.api.v1.ArtifactService/CreateArtifact
)"
# We get a JSON with an signedUploadUrl similar to :
# https://entrepot.xlii.si/twirp/github.actions.results.api.v1.ArtifactService/UploadArtifact?sig=yWWEI8tIIECp8D7E5TVh4_6G2pZxWaVdQcSYaCsx5s0=&expires=2024-08-26+07%3A20%3A49.886890537+%2B0200+CEST&artifactName=mymodule-1.2.3.zip&taskID=63
SIGNED_UPLOAD_URL="$( echo "$RESPONSE" | sed -n 's/.*"signedUploadUrl" *: *"\([^"]\+\)".*/\1/p' )"
# Upload our file
# (note: adding '&comp=block' at the end of the URL)
wget --method PUT --body-file "$MYFILENAME.zip" "$SIGNED_UPLOAD_URL&comp=block"
# Finalize the artifact
wget -O - \
--header 'Content-Type:application/json' \
--header "Authorization: Bearer $GITHUB_TOKEN" \
--post-data "$( printf '{"hash":"sha256:%s", "name":"%s", "size":"%d", "workflow_run_backend_id":"%s", "workflow_job_run_backend_id":"%s"}' "$( sha256sum $MYFILENAME.zip | sed 's/[[:space:]]\+.*//' )" "$MYFILENAME" "$( stat -c %s $MYFILENAME.zip )" "$WORKFLOW_RUN_BACKEND_ID" "$WORKFLOW_JOB_RUN_BACKEND_ID" )" \
"$GITHUB_SERVER_URL"/twirp/github.actions.results.api.v1.ArtifactService/FinalizeArtifact

View file

@ -1,18 +1,5 @@
# CHANGELOG SENDRECURRINGINVOICEBYMAIL FOR [DOLIBARR ERP CRM](https://www.dolibarr.org)
## 0.3.6
Fix: freeform email addresses being "html-filtered" `Postmaster <postmaster@bugness.org>``Postmaster`
## 0.3.5
Fix:
* HTML formating was silently removed when used on Dolibarr v.13+ (GH-11)
* `$conf->global->MAIN_MAIL_ERRORS_TO` might not always be set (cause not found)
## 0.3.4
Fix: the hook was also triggered by supplier invoices.

View file

@ -2,9 +2,9 @@
## Features
(en) This module sends by email the customer invoice generated with a recurring invoice template via scheduled jobs.
(en) This module sends by email the invoice generated with recurring invoices via scheduled jobs.
(fr) Ce module envoie par mail les factures clientes générées automatiquement par les travaux planifiés et les factures modèles.
(fr) Ce module envoie par mail les factures générées automatiquement par les travaux planifiés et les factures modèles.
You can customize the mail globally or by recurring invoice.

View file

@ -120,8 +120,8 @@ class Actionssendrecurringinvoicebymail
'to' => implode(', ', $mailObject->compileEmails('to', true)),
'cc' => implode(', ', $mailObject->compileEmails('cc', true)),
'bcc' => implode(', ', $mailObject->compileEmails('bcc', true)),
'errorsTo' => (isset($conf->global->MAIN_MAIL_ERRORS_TO) ? $conf->global->MAIN_MAIL_ERRORS_TO : ''),
'replyTo' => (isset($conf->global->MAIN_MAIL_ERRORS_TO) ? $conf->global->MAIN_MAIL_ERRORS_TO : ''),
'errorsTo' => $conf->global->MAIN_MAIL_ERRORS_TO,
'replyTo' => $conf->global->MAIN_MAIL_ERRORS_TO,
'subject' => $mailObject->subject,
'message' => $mailObject->body,
'ishtml' => $mailObject->body_ishtml,

View file

@ -69,7 +69,7 @@ class modsendrecurringinvoicebymail extends DolibarrModules
$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.3.6';
$this->version = '0.3.4';
//Url to the file with your last numberversion of this module
//$this->url_last_version = 'http://www.example.com/versionmodule.txt';

View file

@ -103,7 +103,7 @@ do {
if (GETPOST('save')) {
do {
// Validate input data
if (! array_key_exists(GETPOST('fromtype'), $listFrom)) {
if (! array_key_exists(GETPOST('fromtype', 'alpha'), $listFrom)) {
setEventMessages('Unexpected from value', null, 'errors');
break;
}
@ -116,13 +116,13 @@ do {
break;
}
// Validate some non-breaking stuff after feeding
if (empty(GETPOST('sendto_free', 'none')) && empty(GETPOST('sendto_socpeople', 'array'))) {
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', 'none'))) {
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');
@ -140,14 +140,14 @@ do {
$mailObject->fromtype = GETPOST('fromtype', 'alpha');
$mailObject->frommail = $listFrom[$mailObject->fromtype];
$mailObject->sendto_free = GETPOST('sendto_free', 'none');
$mailObject->sendto_free = GETPOST('sendto_free', 'alpha');
$mailObject->sendto_thirdparty = in_array('thirdparty', GETPOST('sendto_socpeople', 'array'));
$mailObject->sendcc_free = GETPOST('sendcc_free', 'none');
$mailObject->sendcc_free = GETPOST('sendcc_free', 'alpha');
$mailObject->sendcc_thirdparty = in_array('thirdparty', GETPOST('sendcc_socpeople', 'array'));
$mailObject->subject = GETPOST('subject', 'none');
$mailObject->body = GETPOST('body', 'none');
$mailObject->subject = GETPOST('subject', 'alpha');
$mailObject->body = GETPOST('body', 'alpha');
$mailObject->body_ishtml = (int)GETPOST('body_ishtml', 'int');
// Save into database