Merge branch 'develop' into PhanTypeInvalidRightOperandOfNumericOp

This commit is contained in:
Laurent Destailleur
2024-03-23 20:44:54 +01:00
committed by GitHub
40 changed files with 362 additions and 112 deletions

16
.github/workflows/README.md vendored Normal file
View File

@@ -0,0 +1,16 @@
# Workflow run order
To reduce run minutes, the following order is put in place:
On PR & Merge, always run:
- pre-commit;
- phan.
When both succeed, start:
- phpstan;
- Windows-ci;
- travis.
See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#running-a-workflow-based-on-the-conclusion-of-another-workflow

40
.github/workflows/ci.yml vendored Normal file
View File

@@ -0,0 +1,40 @@
name: "CI"
on: [push, pull_request]
jobs:
pre-commit:
uses: ./.github/workflows/pre-commit.yml
secrets: inherit
with:
gh_event: ${{ github.event_name }}
phan:
uses: ./.github/workflows/phan.yml
secrets: inherit
with:
gh_event: ${{ github.event_name }}
phpstan:
uses: ./.github/workflows/phpstan.yml
secrets: inherit
needs: [pre-commit, phan]
with:
gh_event: ${{ github.event_name }}
windows-ci:
needs: [pre-commit, phan]
secrets: inherit
uses: ./.github/workflows/windows-ci.yml
with:
gh_event: ${{ github.event_name }}
gh-travis: # Runs travis script on github runner (not on travis)
if: false
# needs: [pre-commit, phan]
# needs: [windows-ci]
secrets: inherit
uses: ./.github/workflows/gh-travis.yml
with:
gh_event: ${{ github.event_name }}
# Note (not tested, from https://github.com/orgs/community/discussions/38361)
# To cancel jobs if one failes, the following action may help
# - if: "failure()"
# uses: "andymckay/cancel-action@0.3"

49
.github/workflows/gh-travis.yml vendored Normal file
View File

@@ -0,0 +1,49 @@
---
# This runs a travis script inside a github runner
name: Travis
# Controls when the workflow will run
on:
# push:
# pull_request:
workflow_call:
inputs:
gh_event:
required: true
type: string
workflow_dispatch:
concurrency:
group: travis-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref
}}
cancel-in-progress: true
env:
gh_event: ${{ inputs.gh_event || github.event_name }}
GITHUB_JSON: ${{ toJSON(github) }} # Helps in debugging Github Action
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job
gh-travis:
# The type of runner that the job will run on
runs-on: ubuntu-latest
strategy:
fail-fast: false
# matrix:
# php-version:
# # PHPStan requires PHP >= 7.2.
# #- "7.2"
# - "8.2"
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
- name: Checkout travis file
uses: actions/checkout@v4
- name: Run .travis.yml build script
uses: ktomk/run-travis-yml@v1
with:
# run-job: travis # name of a job in travis file
allow-failure: false
# file: .travis.yml
# steps: | # Default: setup, before_install, install, before_script, script, after_script, before_deploy
# install
# script
# env:
# TRAVIS_PHP_VERSION: ${{ matrix.php-version }}

View File

@@ -1,16 +1,22 @@
---
on:
pull_request:
push:
schedule:
# execute once a day, the 1st
- cron: 10 9 * * *
# pull_request:
# push:
# schedule:
# # execute once a day, the 1st
# - cron: 10 9 * * *
workflow_call:
inputs:
gh_event:
required: true
type: string
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
group: phan-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
# Do pull analysis on schedule or manual dispatch
gh_event: ${{ inputs.gh_event || github.event_name }}
PHAN_CONFIG: >
${{
( github.event.schedule || github.event_name == 'workflow_dispatch' )
@@ -21,6 +27,7 @@ env:
PHAN_MIN_PHP: 7.0
PHAN_QUICK: ${{ github.event.schedule && '' || '--quick' }}
GITHUB_JSON: ${{ toJSON(github) }} # Helps in debugging Github Action
name: phan
jobs:
phan:

View File

@@ -1,16 +1,25 @@
---
# This is a basic workflow to check code with PHPSTAN tool
name: "PHPStan"
name: PHPStan
# Controls when the workflow will run
on: [push, pull_request]
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
on:
# push:
# pull_request:
workflow_call:
inputs:
gh_event:
required: true
type: string
workflow_dispatch:
concurrency:
group: stan-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref
}}
cancel-in-progress: true
env:
CACHE_KEY_PART: ${{ github.event_name == 'pull_request' && format('{0}-{1}', github.base_ref, github.head_ref) || github.ref_name }}
GITHUB_JSON: ${{ toJSON(github) }} # Helps in debugging Github Action
gh_event: ${{ inputs.gh_event || github.event_name }}
CACHE_KEY_PART: ${{ ( inputs.gh_event == 'pull_request' || github.event_name == 'pull_request' ) && format('{0}-{1}', github.base_ref, github.head_ref) || github.ref_name }}
GITHUB_JSON: ${{ toJSON(github) }} # Helps in debugging Github Action
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job
@@ -23,7 +32,7 @@ jobs:
php-version:
# PHPStan requires PHP >= 7.2.
#- "7.2"
- "8.2"
- '8.2'
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
@@ -34,9 +43,10 @@ jobs:
id: setup-php
uses: shivammathur/setup-php@v2
with:
php-version: "${{ matrix.php-version }}"
php-version: ${{ matrix.php-version }}
tools: phpstan, cs2pr
extensions: calendar, json, imagick, gd, zip, mbstring, intl, opcache, imap, mysql, pgsql, sqlite3, ldap, xml, mcrypt
extensions: calendar, json, imagick, gd, zip, mbstring, intl, opcache, imap,
mysql, pgsql, sqlite3, ldap, xml, mcrypt
# Restore old cache
- name: Restore phpstan cache
@@ -44,7 +54,8 @@ jobs:
uses: actions/cache/restore@v4
with:
path: ./.github/tmp
key: phpstan-cache-${{ matrix.php-version }}-${{ env.CACHE_KEY_PART }}-${{ github.run_id }}
key: phpstan-cache-${{ matrix.php-version }}-${{ env.CACHE_KEY_PART }}-${{
github.run_id }}
restore-keys: |
phpstan-cache-${{ matrix.php-version }}-${{ env.CACHE_KEY_PART }}-
phpstan-cache-${{ matrix.php-version }}-${{ github.head_ref }}-
@@ -61,12 +72,13 @@ jobs:
# continue-on-error: true
# Save cache
- name: "Save phpstan cache"
- name: Save phpstan cache
uses: actions/cache/save@v4
if: ${{ success() || ( ! cancelled() && steps.cache.outputs.cache-hit != 'true' ) }}
with:
path: ./.github/tmp
key: phpstan-cache-${{ matrix.php-version }}-${{ env.CACHE_KEY_PART }}-${{ github.run_id }}
key: phpstan-cache-${{ matrix.php-version }}-${{ env.CACHE_KEY_PART }}-${{
github.run_id }}
- name: Provide phpstan log as artifact
uses: actions/upload-artifact@v4
if: ${{ always() }}

View File

@@ -1,8 +1,17 @@
---
name: pre-commit
on:
pull_request:
push:
# pull_request:
# push:
workflow_call:
inputs:
gh_event:
required: true
type: string
workflow_dispatch:
env:
gh_event: ${{ inputs.gh_event || github.event_name }}
jobs:
pre-commit:
runs-on: ubuntu-latest
@@ -20,7 +29,7 @@ jobs:
- name: Get all changed php files (if PR)
id: changed-php
uses: tj-actions/changed-files@v43
if: github.event_name == 'pull_request'
if: env.gh_event == 'pull_request'
with:
files: |
**.php
@@ -58,7 +67,7 @@ jobs:
# - name: Get all changed php files (if PR)
# id: changed-php
# uses: tj-actions/changed-files@v43
# if: github.event_name == 'pull_request'
# if: env.gh_event == 'pull_request'
# with:
# files: |
# **.php
@@ -72,7 +81,7 @@ jobs:
steps.changed-php.outputs.any_changed == 'true'
||
(
github.event_name == 'push'
env.gh_event == 'push'
&& (
github.event.ref == 'refs/heads/develop'
|| endsWith(github.event.ref, '.0')
@@ -94,7 +103,7 @@ jobs:
- name: Run some pre-commit hooks on all files on push to "main" branches
if: |
github.event_name == 'push'
env.gh_event == 'push'
&& (
github.event.ref == 'refs/heads/develop'
|| endsWith(github.event.ref, '.0')

View File

@@ -2,19 +2,26 @@
name: Win CI
# yamllint disable-line rule:truthy
on:
push:
pull_request:
# push:
# pull_request:
workflow_call:
inputs:
gh_event:
required: true
type: string
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref
group: win-ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref
}}
cancel-in-progress: true
env:
gh_event: ${{ inputs.gh_event || github.event_name }}
PHPUNIT_LOG: phpunit_tests.log
DOLIBARR_LOG: documents/dolibarr.log
PHPSERVER_LOG: phpserver.log
PHPSERVER_DOMAIN_PORT: 127.0.0.1:8000 # could be 127.0.0.1:8000 if config modified
CACHE_KEY_PART: ${{ github.event_name == 'pull_request' && format('{0}-{1}', github.base_ref, github.head_ref) || github.ref_name }}
CACHE_KEY_PART: ${{ ( inputs.gh_event == 'pull_request' || github.event_name == 'pull_request' ) && format('{0}-{1}', github.base_ref, github.head_ref) || github.ref_name }}
PHP_INI_SCAN_DIR: C:\myphpini
CKEY: win-ci-2
GITHUB_JSON: ${{ toJSON(github) }} # Helps in debugging Github Action

View File

@@ -3,6 +3,7 @@
* Copyright (C) 2005-2009 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2013 Juanjo Menent <jmenent@2byte.es>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
*
* 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
@@ -112,11 +113,16 @@ if ($action == 'set') {
dolibarr_del_const($db, 'SYSLOG_HANDLERS', -1); // To be sure there is not a setup into another entity
dolibarr_set_const($db, 'SYSLOG_HANDLERS', json_encode($activeModules), 'chaine', 0, '', 0);
$error = 0;
$errors = [];
// Check configuration
foreach ($activeModules as $modulename) {
$module = new $modulename();
$error = $module->checkConfiguration();
$res = $module->checkConfiguration();
if (!$res) {
$error++;
$errors = array_merge($errors, $module->errors);
}
}
@@ -125,7 +131,7 @@ if ($action == 'set') {
setEventMessages($langs->trans("SetupSaved"), null, 'mesgs');
} else {
$db->rollback();
setEventMessages($error, $errors, 'errors');
setEventMessages('', $errors, 'errors');
}
}

View File

@@ -379,7 +379,7 @@ if (GETPOST('withtab', 'alpha')) {
// Add $param from extra fields
//include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">';
print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'?output=file">';
print '<input type="hidden" name="token" value="'.newToken().'">';
print '<div class="right">';

View File

@@ -1916,9 +1916,9 @@ if ($id > 0) {
*/
print '</td><td td colspan="3">';
$tzforfullday = getDolGlobalString('MAIN_STORE_FULL_EVENT_IN_GMT');
print $form->selectDate($datep ? $datep : $object->datep, 'ap', 1, 1, 0, "action", 1, 1, 0, 'fulldaystart', '', '', '', 1, '', '', $object->fulldayevent ? ($tzforfullday ? $tzforfullday : 'tzuserrel') : 'tzuserrel');
print $form->selectDate($datep ? $datep : $object->datep, 'ap', 1, 1, 0, "action", 1, 2, 0, 'fulldaystart', '', '', '', 1, '', '', $object->fulldayevent ? ($tzforfullday ? $tzforfullday : 'tzuserrel') : 'tzuserrel');
print ' <span class="hideonsmartphone">&nbsp; &nbsp; - &nbsp; &nbsp;</span> ';
print $form->selectDate($datef ? $datef : $object->datef, 'p2', 1, 1, 1, "action", 1, 0, 0, 'fulldayend', '', '', '', 1, '', '', $object->fulldayevent ? ($tzforfullday ? $tzforfullday : 'tzuserrel') : 'tzuserrel');
print $form->selectDate($datef ? $datef : $object->datef, 'p2', 1, 1, 1, "action", 1, 2, 0, 'fulldayend', '', '', '', 1, '', '', $object->fulldayevent ? ($tzforfullday ? $tzforfullday : 'tzuserrel') : 'tzuserrel');
print '</td></tr>';
print '<tr><td class="">&nbsp;</td><td></td></tr>';

View File

@@ -729,7 +729,7 @@ $url = DOL_URL_ROOT.'/comm/action/card.php?action=create';
$url .= '&apyear='.$tmpforcreatebutton['year'].'&apmonth='.$tmpforcreatebutton['mon'].'&apday='.$tmpforcreatebutton['mday'].'&aphour='.$tmpforcreatebutton['hours'].'&apmin='.$tmpforcreatebutton['minutes'];
$url .= '&backtopage='.urlencode($_SERVER["PHP_SELF"].($newparam ? '?'.$newparam : ''));
$newcardbutton = dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', $url, '', $user->rights->agenda->myactions->create || $user->hasRight('agenda', 'allactions', 'create'));
$newcardbutton = dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', $url, '', $user->hasRight('agenda', 'myactions', 'create') || $user->hasRight('agenda', 'allactions', 'create'));
$param .= '&mode='.urlencode($mode);

View File

@@ -584,6 +584,9 @@ class AdvanceTargetingMailing extends CommonObject
if (!empty($arrayquery['cust_saleman']) && count($arrayquery['cust_saleman']) > 0) {
$sqlwhere[] = " (saleman.fk_user IN (".$this->db->sanitize(implode(',', $arrayquery['cust_saleman']))."))";
}
if (!empty($arrayquery['cust_state']) && count($arrayquery['cust_state']) > 0) {
$sqlwhere[] = " (t.fk_departement IN (".$this->db->sanitize(implode(',', $arrayquery['cust_state']))."))";
}
if (!empty($arrayquery['cust_country']) && count($arrayquery['cust_country']) > 0) {
$sqlwhere[] = " (t.fk_pays IN (".$this->db->sanitize(implode(',', $arrayquery['cust_country']))."))";
}
@@ -825,6 +828,12 @@ class AdvanceTargetingMailing extends CommonObject
if (!empty($arrayquery['cust_saleman']) && count($arrayquery['cust_saleman']) > 0) {
$sqlwhere[] = " (saleman.fk_user IN (".$this->db->sanitize(implode(',', $arrayquery['cust_saleman']))."))";
}
//if (!empty($arrayquery['cust_state'])) {
// $sqlwhere[] = $this->transformToSQL('tsd.nom', $arrayquery['cust_state']);
//}
if (!empty($arrayquery['cust_state']) && count($arrayquery['cust_state']) > 0) {
$sqlwhere[] = " (t.fk_departement IN (".$this->db->sanitize(implode(',', $arrayquery['cust_state']))."))";
}
if (!empty($arrayquery['cust_country']) && count($arrayquery['cust_country']) > 0) {
$sqlwhere[] = " (ts.fk_pays IN (".$this->db->sanitize(implode(',', $arrayquery['cust_country']))."))";
}

View File

@@ -87,6 +87,67 @@ class FormAdvTargetEmailing extends Form
return $this->advMultiselectarray($htmlname, $options_array, $selected_array);
}
/**
* Return combo list of activated countries, into language of user
*
* @param string $htmlname of html select object
* @param array $selected_array or Code or Label of preselected country
* @return string HTML string with select
*/
public function multiselectState($htmlname = 'state_id', $selected_array = array())
{
global $conf, $langs;
$langs->load("dict");
$maxlength = 0;
$out = '';
$stateArray = array();
$label = array();
$options_array = array();
$sql = "SELECT d.rowid as rowid, d.code_departement as code, d.nom as department, r.nom as region";
$sql .= " FROM ".MAIN_DB_PREFIX."c_departements d";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_regions r on d.fk_region=r.code_region";
$sql .= " WHERE d.active = 1 AND d.code_departement<>'' AND r.code_region<>''";
//$sql .= " ORDER BY r.nom ASC, d.nom ASC";
$resql = $this->db->query($sql);
if ($resql) {
$num = $this->db->num_rows($resql);
$i = 0;
if ($num) {
$foundselected = false;
while ($i < $num) {
$obj = $this->db->fetch_object($resql);
$stateArray [$i] ['rowid'] = $obj->rowid;
$stateArray [$i] ['code'] = $obj->code;
$stateArray [$i] ['label'] = $obj->region.'/'.$obj->department;
$label[$i] = $stateArray[$i]['label'];
$i++;
}
$array1_sort_order = SORT_ASC;
array_multisort($label, $array1_sort_order, $stateArray);
foreach ($stateArray as $row) {
$label = dol_trunc($row['label'], $maxlength, 'middle');
if ($row['code']) {
$label .= ' ('.$row['code'].')';
}
$options_array[$row['rowid']] = $label;
}
}
} else {
dol_print_error($this->db);
}
return $this->advMultiselectarray($htmlname, $options_array, $selected_array);
}
/**
* Return combo list of activated countries, into language of user
*

View File

@@ -72,7 +72,7 @@ $date_stopMonth = GETPOSTINT('date_stopmonth');
$date_stopYear = GETPOSTINT('date_stopyear');
$date_stop = dol_mktime(23, 59, 59, $date_stopMonth, $date_stopDay, $date_stopYear, 'tzuserrel');
$action = GETPOST('action', 'aZ09');
$projectid = (GETPOSTINT('projectid') ? GETPOSTINT('projectid') : 0);
$projectid = GETPOSTINT('projectid');
// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
$hookmanager->initHooks(array('comptafileslist', 'globallist'));
@@ -667,7 +667,7 @@ foreach ($listofchoices as $choice => $val) {
$disabled = ' disabled';
}
$checked = (((!GETPOSTISSET('search') && $action != 'searchfiles') || GETPOST($choice)) ? ' checked="checked"' : '');
print '<div class="'.($i > 0 ? 'paddingleft marginleftonly' : '').' inline-block marginrightonly paddingright"><input type="checkbox" id="'.$choice.'" name="'.$choice.'" value="1"'.$checked.$disabled.'><label for="'.$choice.'"> ';
print '<div class="inline-block marginrightonlylarge paddingright margintoponly"><input type="checkbox" id="'.$choice.'" name="'.$choice.'" value="1"'.$checked.$disabled.'><label for="'.$choice.'"> ';
print img_picto($langs->trans($val['label']), $val['picto'], 'class=""').' '.$langs->trans($val['label']);
print '</label></div>';
$i++;
@@ -701,7 +701,7 @@ if (!empty($date_start) && !empty($date_stop)) {
echo dol_print_date($date_start, 'day', 'tzuserrel')." - ".dol_print_date($date_stop, 'day', 'tzuserrel');
print '<a class="marginleftonly small'.(empty($TData) ? ' butActionRefused' : ' butAction').'" href="'.$_SERVER["PHP_SELF"].'?action=dl&token='.currentToken().'&projectid='.$projectid.'&output=file&file='.urlencode($filename).$param.'"';
print '<a class="marginleftonly small'.(empty($TData) ? ' butActionRefused' : ' butAction').'" href="'.$_SERVER["PHP_SELF"].'?action=dl&token='.currentToken().'&projectid='.((int) $projectid).'&output=file&file='.urlencode($filename).$param.'"';
if (empty($TData)) {
print " disabled";
}

View File

@@ -1,5 +1,6 @@
<?php
/* Copyright (C) 2013 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
*
* 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
@@ -68,7 +69,7 @@ class box_graph_invoices_permonth extends ModeleBoxes
//include_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
//$facturestatic=new Facture($this->db);
$startmonth = $conf->global->SOCIETE_FISCAL_MONTH_START ? ($conf->global->SOCIETE_FISCAL_MONTH_START) : 1;
$startmonth = getDolGlobalInt('SOCIETE_FISCAL_MONTH_START', 1);
if (!getDolGlobalString('GRAPH_USE_FISCAL_YEAR')) {
$startmonth = 1;
}

View File

@@ -1,5 +1,6 @@
<?php
/* Copyright (C) 2013 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
*
* 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
@@ -65,7 +66,7 @@ class box_graph_invoices_peryear extends ModeleBoxes
//include_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
//$facturestatic=new Facture($this->db);
$startmonth = $conf->global->SOCIETE_FISCAL_MONTH_START ? ($conf->global->SOCIETE_FISCAL_MONTH_START) : 1;
$startmonth = getDolGlobalInt('SOCIETE_FISCAL_MONTH_START', 1);
if (!getDolGlobalString('GRAPH_USE_FISCAL_YEAR')) {
$startmonth = 1;
}

View File

@@ -1,5 +1,6 @@
<?php
/* Copyright (C) 2013 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
*
* 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
@@ -66,7 +67,7 @@ class box_graph_invoices_supplier_permonth extends ModeleBoxes
include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
$startmonth = $conf->global->SOCIETE_FISCAL_MONTH_START ? ($conf->global->SOCIETE_FISCAL_MONTH_START) : 1;
$startmonth = getDolGlobalInt('SOCIETE_FISCAL_MONTH_START', 1);
if (!getDolGlobalString('GRAPH_USE_FISCAL_YEAR')) {
$startmonth = 1;
}

View File

@@ -1,5 +1,6 @@
<?php
/* Copyright (C) 2013 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
*
* 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
@@ -67,7 +68,7 @@ class box_graph_orders_permonth extends ModeleBoxes
//include_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
//$commandestatic=new Commande($this->db);
$startmonth = $conf->global->SOCIETE_FISCAL_MONTH_START ? ($conf->global->SOCIETE_FISCAL_MONTH_START) : 1;
$startmonth = getDolGlobalInt('SOCIETE_FISCAL_MONTH_START', 1);
if (!getDolGlobalString('GRAPH_USE_FISCAL_YEAR')) {
$startmonth = 1;
}

View File

@@ -1,5 +1,6 @@
<?php
/* Copyright (C) 2013 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
*
* 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
@@ -66,7 +67,7 @@ class box_graph_orders_supplier_permonth extends ModeleBoxes
include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
$startmonth = $conf->global->SOCIETE_FISCAL_MONTH_START ? ($conf->global->SOCIETE_FISCAL_MONTH_START) : 1;
$startmonth = getDolGlobalInt('SOCIETE_FISCAL_MONTH_START', 1);
if (!getDolGlobalString('GRAPH_USE_FISCAL_YEAR')) {
$startmonth = 1;
}

View File

@@ -1,5 +1,6 @@
<?php
/* Copyright (C) 2013 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
*
* 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
@@ -67,7 +68,7 @@ class box_graph_propales_permonth extends ModeleBoxes
//include_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php';
//$propalstatic=new Propal($this->db);
$startmonth = $conf->global->SOCIETE_FISCAL_MONTH_START ? ($conf->global->SOCIETE_FISCAL_MONTH_START) : 1;
$startmonth = getDolGlobalInt('SOCIETE_FISCAL_MONTH_START', 1);
if (!getDolGlobalString('GRAPH_USE_FISCAL_YEAR')) {
$startmonth = 1;
}

View File

@@ -1,9 +1,9 @@
<?php
/* Copyright (C) 2003-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2017 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2015-2023 Frédéric France <frederic.france@netlogic.fr>
* Copyright (C) 2021-2023 Waël Almoman <info@almoman.com>
/* Copyright (C) 2003-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2017 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2015-2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2021-2023 Waël Almoman <info@almoman.com>
*
* 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
@@ -140,12 +140,11 @@ class box_members_by_tags extends ModeleBoxes
$line++;
$AdherentTag = array();
foreach ($sumMembers as $key => $data) {
$adhtag = new Categorie($this->db);
$adhtag->id = $key;
if ($key == 'total') {
break;
}
$adhtag = new Categorie($this->db);
$adhtag->id = (int) $key;
$adhtag->label = $data['label'];
$AdherentTag[$key] = $adhtag;

View File

@@ -1,9 +1,9 @@
<?php
/* Copyright (C) 2003-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2017 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2015-2023 Frederic France <frederic.france@netlogic.fr>
* Copyright (C) 2021-2023 Waël Almoman <info@almoman.com>
/* Copyright (C) 2003-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2017 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2015-2024 Frédéric France <frederic.france@free.fr>
* Copyright (C) 2021-2023 Waël Almoman <info@almoman.com>
*
* 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
@@ -140,12 +140,11 @@ class box_members_by_type extends ModeleBoxes
$line++;
$AdherentType = array();
foreach ($sumMembers as $key => $data) {
$adhtype = new AdherentType($this->db);
$adhtype->id = $key;
if ($key == 'total') {
break;
}
$adhtype = new AdherentType($this->db);
$adhtype->id = (int) $key;
$adhtype->label = $data['label'];
$AdherentType[$key] = $adhtype;

View File

@@ -2,7 +2,7 @@
/* Copyright (C) 2003-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2017 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2015-2020 Frederic France <frederic.france@netlogic.fr>
* Copyright (C) 2015-2024 Frédéric France <frederic.france@free.fr>
*
* 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
@@ -110,7 +110,7 @@ class box_members_last_modified extends ModeleBoxes
$memberstatic->email = $objp->email;
$memberstatic->morphy = $objp->morphy;
$memberstatic->company = $objp->company;
$memberstatic->statut = $objp->status;
$memberstatic->status = $objp->status;
$memberstatic->date_creation = $datec;
$memberstatic->date_modification = $datem;
$memberstatic->need_subscription = $objp->subscription;

View File

@@ -1,8 +1,8 @@
<?php
/* Copyright (C) 2003-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2017 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2015-2020 Frederic France <frederic.france@netlogic.fr>
/* Copyright (C) 2003-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2017 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2015-2024 Frédéric France <frederic.france@free.fr>
*
* 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
@@ -110,7 +110,7 @@ class box_members_last_subscriptions extends ModeleBoxes
$staticmember->email = $obj->email;
$staticmember->photo = $obj->photo;
$staticmember->morphy = $obj->morphy;
$staticmember->statut = $obj->status;
$staticmember->status = $obj->status;
$staticmember->need_subscription = $obj->need_subscription;
$staticmember->datefin = $this->db->jdate($obj->date_end_subscription);
if (!empty($obj->fk_soc)) {

View File

@@ -1,6 +1,6 @@
<?php
/* Copyright (C) 2012-2018 Charlene BENKE <charlie@patas-monkey.com>
* Copyright (C) 2015-2021 Frederic France <frederic.france@netlogic.fr>
* Copyright (C) 2015-2024 Frédéric France <frederic.france@free.fr>
*
* 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
@@ -174,7 +174,7 @@ class box_task extends ModeleBoxes
$taskstatic->ref = $objp->ref;
$taskstatic->label = $objp->label;
$taskstatic->progress = $objp->progress;
$taskstatic->fk_statut = $objp->fk_statut;
$taskstatic->status = $objp->fk_statut;
$taskstatic->date_end = $this->db->jdate($objp->datee);
$taskstatic->planned_workload = $objp->planned_workload;
$taskstatic->duration_effective = $objp->duration_effective;

View File

@@ -40,8 +40,9 @@ interface Database
/**
* Return datas as an array
*
* @param resource $resultset Resultset of request
* @return array Array
* @param resource $resultset Resultset of request
* @return array Array
* @deprecated Use fetch_object() so you can access a field with its name instead of using an index of position of field.
*/
public function fetch_row($resultset);
// phpcs:enable
@@ -441,6 +442,16 @@ interface Database
);
// phpcs:enable
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* List information of columns into a table.
*
* @param string $table Name of table
* @return array Array with information on table
*/
public function DDLInfoTable($table);
// phpcs:enable
/**
* Convert (by PHP) a PHP server TZ string date into a Timestamps date (GMT if gm=true)
* 19700101020000 -> 3600 with TZ+1 and gmt=0
@@ -470,16 +481,6 @@ interface Database
*/
public function commit($log = '');
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* List information of columns into a table.
*
* @param string $table Name of table
* @return array Array with information on table
*/
public function DDLInfoTable($table);
// phpcs:enable
/**
* Free last resultset used.
*

View File

@@ -481,7 +481,6 @@ class DoliDBMysqli extends DoliDB
return $this->db->affected_rows;
}
/**
* Libere le dernier resultset utilise sur cette connection
*

View File

@@ -125,7 +125,7 @@ class pdf_canelle extends ModelePDFSuppliersInvoices
/* if (!empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT) || !empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT_COLUMN)) {
$this->posxtva = $this->posxup;
} */
$this->posxpicture = $this->posxtva - (!getDolGlobalString('MAIN_DOCUMENTS_WITH_PICTURE_WIDTH') ? 20 : $conf->global->MAIN_DOCUMENTS_WITH_PICTURE_WIDTH); // width of images
$this->posxpicture = $this->posxtva - (getDolGlobalInt('MAIN_DOCUMENTS_WITH_PICTURE_WIDTH', 20)); // width of images
if ($this->page_largeur < 210) { // To work with US executive format
$this->posxpicture -= 20;
$this->posxtva -= 20;

View File

@@ -1,4 +1,6 @@
<?php
/* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
*/
/*
* 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
@@ -24,6 +26,11 @@ class LogHandler
{
protected $ident = 0;
/**
* @var string[] Array of errors messages
*/
public $errors = [];
/**
* Content of the info tooltip.
@@ -80,11 +87,11 @@ class LogHandler
* It will be called after setting the configuration.
* The function returns an array with error messages
*
* @return array
* @return bool
*/
public function checkConfiguration()
{
return array();
return true;
}
/**

View File

@@ -1,4 +1,6 @@
<?php
/* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
*/
/*
* 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
@@ -79,7 +81,7 @@ interface LogHandlerInterface
/**
* Output log content
*
* @param string $content Content to log
* @param array $content Content to log
* @return void
*/
public function export($content);

View File

@@ -1,5 +1,6 @@
<?php
/* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
*/
require_once DOL_DOCUMENT_ROOT.'/core/modules/syslog/logHandler.php';
@@ -78,23 +79,21 @@ class mod_syslog_file extends LogHandler implements LogHandlerInterface
/**
* Return if configuration is valid
*
* @return array Array of errors. Empty array if ok.
* @return bool true if ok
*/
public function checkConfiguration()
{
global $langs;
$errors = array();
$filename = $this->getFilename();
if (file_exists($filename) && is_writable($filename)) {
dol_syslog('admin/syslog: file '.$filename);
return true;
} else {
$errors[] = $langs->trans("ErrorFailedToOpenFile", $filename);
$this->errors[] = $langs->trans("ErrorFailedToOpenFile", $filename);
return false;
}
return $errors;
}
/**

View File

@@ -1,4 +1,6 @@
<?php
/* Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
*/
require_once DOL_DOCUMENT_ROOT.'/core/modules/syslog/logHandler.php';
@@ -77,15 +79,14 @@ class mod_syslog_syslog extends LogHandler implements LogHandlerInterface
/**
* Return if configuration is valid
*
* @return array Array of errors. Empty array if ok.
* @return bool True if ok.
*/
public function checkConfiguration()
{
global $conf, $langs;
global $langs;
$errors = array();
$facility = constant(getDolGlobalString('SYSLOG_FACILITY'));
$facility = constant($conf->global->SYSLOG_FACILITY);
if ($facility) {
// Only LOG_USER supported on Windows
if (!empty($_SERVER["WINDIR"])) {
@@ -93,11 +94,11 @@ class mod_syslog_syslog extends LogHandler implements LogHandlerInterface
}
dol_syslog("admin/syslog: facility ".$facility);
return true;
} else {
$errors[] = $langs->trans("ErrorUnknownSyslogConstant", $facility);
$this->errors[] = $langs->trans("ErrorUnknownSyslogConstant", $facility);
return false;
}
return $errors;
}
/**

View File

@@ -110,9 +110,9 @@ if (!empty($array_query['cust_code'])) {
print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
$cust_code_str = (string) $array_query['cust_code'];
} else {
$cust_code_str = "null";
$cust_code_str = null;
}
print '</td><td><input type="text" name="cust_code" value="'.$cust_code_str.'"/></td><td>'."\n";
print '</td><td><input type="text" name="cust_code"'.($cust_code_str!=null?' value="'.$cust_code_str:'').'"/></td><td>'."\n";
print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
print '</td></tr>'."\n";
@@ -143,6 +143,16 @@ print '</td><td><input type="text" name="cust_city" value="'.$array_query['cust_
print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
print '</td></tr>'."\n";
// State Client
print '<tr><td>'.$langs->trans('State');
if (!empty($array_query['cust_state'])) {
print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
}
print '</td><td>'."\n";
print $formadvtargetemaling->multiselectState('cust_state', $array_query['cust_state']);
print '</td><td>'."\n";
print '</td></tr>'."\n";
// Customer Country
print '<tr><td>'.$langs->trans("Country");
if (!empty($array_query['cust_country'])) {

View File

@@ -117,7 +117,7 @@ class Cronjob extends CommonObject
public $lastoutput;
/**
* @var string Unit frequency of job execution
* @var int Unit frequency of job execution (60, 86400, ...)
*/
public $unitfrequency;

View File

@@ -143,7 +143,8 @@ $result = @include_once $conffile; // Keep @ because with some error reporting m
$listofwrappers = stream_get_wrappers();
// We need '.phar' for geoip2. TODO Replace phar in geoip with exploded files so we can disable phar by default.
// phar stream does not auto unserialize content (possible code execution) since PHP 8.1
$arrayofstreamtodisable = array('compress.zlib', 'compress.bzip2', 'ftp', 'ftps', 'glob', 'data', 'expect', 'ogg', 'rar', 'zip', 'zlib');
// zip stream is necessary by excel import module
$arrayofstreamtodisable = array('compress.zlib', 'compress.bzip2', 'ftp', 'ftps', 'glob', 'data', 'expect', 'ogg', 'rar', 'zlib');
if (!empty($dolibarr_main_stream_to_disable) && is_array($dolibarr_main_stream_to_disable)) {
$arrayofstreamtodisable = $dolibarr_main_stream_to_disable;
}

View File

@@ -887,6 +887,7 @@ class FactureFournisseur extends CommonInvoice
$sql .= " t.note_private,";
$sql .= " t.note_public,";
$sql .= " t.model_pdf,";
$sql .= " t.last_main_doc,";
$sql .= " t.import_key,";
$sql .= " t.extraparams,";
$sql .= " cr.code as cond_reglement_code, cr.libelle as cond_reglement_label, cr.libelle_facture as cond_reglement_doc,";
@@ -967,6 +968,7 @@ class FactureFournisseur extends CommonInvoice
$this->note_private = $obj->note_private;
$this->note_public = $obj->note_public;
$this->model_pdf = $obj->model_pdf;
$this->last_main_doc = $obj->last_main_doc;
$this->import_key = $obj->import_key;
//Incoterms

View File

@@ -150,7 +150,7 @@ class modMyModule extends DolibarrModules
// Prerequisites
$this->phpmin = array(7, 1); // Minimum version of PHP required by module
$this->need_dolibarr_version = array(11, -3); // Minimum version of Dolibarr required by module
$this->need_dolibarr_version = array(19, -3); // Minimum version of Dolibarr required by module
$this->need_javascript_ajax = 0;
// Messages at activation

View File

@@ -1346,6 +1346,9 @@ select.flat.selectlimit {
.marginrightonlyshort {
margin-<?php echo $right; ?>: 4px !important;
}
.marginrightonlylarge {
margin-<?php echo $right; ?>: 20px !important;
}
.margintoponly {
margin-top: 10px !important;
}

View File

@@ -1572,6 +1572,9 @@ select.flat.selectlimit {
.marginrightonlyshort {
margin-<?php echo $right; ?>: 4px !important;
}
.marginrightonlylarge {
margin-<?php echo $right; ?>: 20px !important;
}
.margintoponly {
margin-top: 10px !important;
}

View File

@@ -1085,16 +1085,18 @@ class Website extends CommonObject
$allaliases = $objectpageold->pageurl;
$allaliases .= ($objectpageold->aliasalt ? ','.$objectpageold->aliasalt : '');
if (!getDolGlobalInt('WEBSITE_EXPORT_KEEP_FILES_OF_PAGES')) { // We don't need to keep the PHP files of pages and aliases (they are regenerated at import) so we remove them. You can ask to keep them in the export
if (!getDolGlobalInt('WEBSITE_EXPORT_KEEP_FILES_OF_PAGES')) {
// We don't need to keep the PHP files of pages and aliases (they are regenerated at import) so we remove them.
// Delete the pageX.tpl.php page
dol_delete_file($conf->website->dir_temp.'/'.$website->ref.'/containers/page'.$objectpageold->id.'.tpl.php', 0, 0, 0, null, false, 0);
// Delete the alias page
dol_delete_file($conf->website->dir_temp.'/'.$website->ref.'/containers/'.$objectpageold->pageurl.'.php', 0, 0, 0, null, false, 0);
dol_delete_file($conf->website->dir_temp.'/'.$website->ref.'/containers/*/'.$objectpageold->pageurl.'.php', 0, 0, 0, null, false, 0);
// Delete alternative alias pages
foreach ($objectpageold->aliasalt as $tmpaliasalt) {
dol_delete_file($conf->website->dir_temp.'/'.$website->ref.'/containers/'.$tmpaliasalt.'.php', 0, 0, 0, null, false, 0);
dol_delete_file($conf->website->dir_temp.'/'.$website->ref.'/containers/*/'.$tmpaliasalt.'.php', 0, 0, 0, null, false, 0);
$arrayofaliases = explode(',', $objectpageold->aliasalt);
foreach ($arrayofaliases as $tmpaliasalt) {
dol_delete_file($conf->website->dir_temp.'/'.$website->ref.'/containers/'.trim($tmpaliasalt).'.php', 0, 0, 0, null, false, 0);
dol_delete_file($conf->website->dir_temp.'/'.$website->ref.'/containers/*/'.trim($tmpaliasalt).'.php', 0, 0, 0, null, false, 0);
}
}