Compare commits

...

111 Commits

Author SHA1 Message Date
Laurent Destailleur
4ea6af9535 Merge branch '21.0' of git@github.com:Dolibarr/dolibarr.git into 22.0 2025-12-05 16:38:15 +01:00
Laurent Destailleur
2e46ac45c5 Merge branch '20.0' of git@github.com:Dolibarr/dolibarr.git into 21.0 2025-12-05 16:34:02 +01:00
Laurent Destailleur
5db0825b49 Merge branch '20.0' of git@github.com:Dolibarr/dolibarr.git into 20.0 2025-12-05 16:28:27 +01:00
Laurent Destailleur
a098185476 Merge branch '19.0' of git@github.com:Dolibarr/dolibarr.git into 20.0 2025-12-05 16:27:07 +01:00
Laurent Destailleur
7cd529a179 Merge branch '18.0' of git@github.com:Dolibarr/dolibarr.git into 19.0 2025-12-05 16:22:11 +01:00
Laurent Destailleur
82c3849baa Fix CI 2025-12-05 16:21:15 +01:00
Laurent Destailleur
d3d02d90f1 Merge pull request #36545 from BenjaminFlr/betterissue36514
FIX(propal): values lost when editing HT price
2025-12-05 12:02:44 +01:00
Benjamin Falière
2050a657cf FIX(propal): values lost when editing HT price 2025-12-05 11:23:31 +01:00
Laurent Destailleur
d2acb6010f Merge pull request #36537 from aspangaro/22_asset1
FIX Accountancy - #36090 Inconsistent date on various journal
2025-12-05 09:50:28 +01:00
Laurent Destailleur
b2fe08cd3b Merge pull request #36538 from aspangaro/22_asset2
FIX Accountancy - Not propose to write operation on draft asset
2025-12-05 09:49:08 +01:00
Laurent Destailleur
c932a1c878 Merge pull request #36542 from ATM-Consulting/FIX/155/18.0/regression-variable-renaming
FIX: fix #36401 (for v17.0) doesn't work in v18.0+ because of variable renaming
2025-12-05 09:48:32 +01:00
Laurent Destailleur
f2f8278603 Merge pull request #36539 from W1W1-M/backport-fix-propal-update-shipping-availability
FIX propal shipping and availability update (v18+)
2025-12-05 09:47:25 +01:00
Laurent Destailleur
59aa76e475 Merge pull request #36540 from aspangaro/22_asset4
FIX Accountancy - Reverse accounting account in depreciation expense entries for fixed assets
2025-12-05 09:46:45 +01:00
atm-florian
cc5a8fd15a FIX: PR#36401 fixed a missing GETPOSTISSET() but the check involves a variable ($taskid) that was renamed ($tmptaskid) in 18.0 2025-12-05 09:29:15 +01:00
Alexandre SPANGARO
c480cd4801 FIX Accountancy - Reverse accounting account in depreciation expense entries for fixed assets 2025-12-05 08:58:00 +01:00
William Mead
a567cade7d Fixed shipping and availability updating. Updated contributor details. 2025-12-05 08:56:14 +01:00
Alexandre SPANGARO
67d7fa8f78 FIX Accountancy - Not propose to write operation on draft asset 2025-12-05 06:47:49 +01:00
Alexandre SPANGARO
77e8924c93 FIX #36090 Accountancy - Inconsistent date on various journal 2025-12-05 06:41:39 +01:00
Laurent Destailleur
764bb3791b Fix CI 2025-12-04 21:51:03 +01:00
Laurent Destailleur
9ac82f488e Fix CI 2025-12-04 21:50:26 +01:00
Laurent Destailleur
8fe5d2758a Fix CI 2025-12-04 21:48:44 +01:00
Laurent Destailleur
a9d2c95fdd Fix CI 2025-12-04 21:47:02 +01:00
Laurent Destailleur
b4c374fd48 Fix CI 2025-12-04 21:45:34 +01:00
Laurent Destailleur
c9d1f3baa3 Merge pull request #36527 from FHenry/22_fix_subtotal_attribute_copy
fix: when create invoices from orders list, title and subtotal attribute is now copied
2025-12-04 21:26:01 +01:00
HENRY Florian
a3dfae7792 Merge branch '22.0' into 22_fix_subtotal_attribute_copy 2025-12-04 20:30:17 +01:00
Laurent Destailleur
78316a577d Merge branch '21.0' of git@github.com:Dolibarr/dolibarr.git into 22.0 2025-12-04 20:26:59 +01:00
Florian HENRY
7e264b0097 Merge branch '22.0' of https://github.com/Dolibarr/dolibarr into 22_fix_subtotal_attribute_copy 2025-12-04 19:58:49 +01:00
Florian HENRY
12936afb13 review 2025-12-04 19:58:42 +01:00
Laurent Destailleur
3068a778da Merge branch '20.0' of git@github.com:Dolibarr/dolibarr.git into 21.0 2025-12-04 19:51:48 +01:00
Laurent Destailleur
9d307a4238 Merge branch '19.0' of git@github.com:Dolibarr/dolibarr.git into 20.0 2025-12-04 19:07:33 +01:00
Laurent Destailleur
193a42cd47 Fix #36520 2025-12-04 19:02:57 +01:00
Laurent Destailleur
222cd76799 Merge branch '18.0' of git@github.com:Dolibarr/dolibarr.git into 19.0 2025-12-04 18:53:04 +01:00
Laurent Destailleur
47799b88cf Merge branch '17.0' of git@github.com:Dolibarr/dolibarr.git into 18.0 2025-12-04 18:40:23 +01:00
Laurent Destailleur
78ca968db6 Merge pull request #36517 from atm-florianm/SEC/commented-out-restrictedArea
SEC: FIX #36430 permissions not checked on other tabs of HRM evaluation card
2025-12-04 18:37:46 +01:00
Laurent Destailleur
e6f9741987 Merge pull request #36521 from JonBendtsen/BUG_35655_API_Contract_Creation_Fails_for_Non-Admin_Users_in_Version_22.0.2
FIX #35655 API Contract Creation Fails for Non-Admin Users in Version 22.0.2
2025-12-04 18:32:46 +01:00
Laurent Destailleur
50db4e6499 Merge pull request #36518 from JonBendtsen/fix_36507_commit_9801f02
Fix broken commit 9801f02 mentioned in issue #36507
2025-12-04 18:15:43 +01:00
Laurent Destailleur
0235e86f64 Merge pull request #36484 from Hystepik/fix-#36475
Fix #36475 bad value for project  gantt start
2025-12-04 17:43:03 +01:00
Laurent Destailleur
526da8e5a7 Merge pull request #36505 from otcesar/22.0
Fix translation for import error
2025-12-04 16:37:31 +01:00
Jon Bendtsen
8deec3f918 it returns an Object, but it can not be TimeSpent because that creates a infinite loop 2025-12-04 16:23:13 +01:00
Laurent Destailleur
23db225ec3 Merge pull request #36523 from FHenry/22_fix_subtotal_feature
FIX: subtotal feature button availablity according setup
2025-12-04 14:30:43 +01:00
Laurent Destailleur
d647a95de8 Merge pull request #36525 from BenjaminFlr/issue36514
FIX(propal): Incorrect HT/TTC recalculation when editing proposal lines #36514
2025-12-04 14:24:08 +01:00
Florian HENRY
7f3ac106fc fix: when create bills from orders list, title and subtotal attribute is now copied 2025-12-04 11:00:58 +01:00
Florian HENRY
c39cba8395 fix: when create bills from orders list, title and subtotal attribute is now copied 2025-12-04 10:57:24 +01:00
Laurent Destailleur
aa8fac1deb Merge pull request #36429 from atm-adrien/FIX/MulticompanyStockCompatibility
FIX : Implementation of multi-company compatibility with inventory/warehouse management
2025-12-04 10:42:35 +01:00
Benjamin Falière
68004a4009 FIX(propal): Incorrect HT/TTC recalculation when editing proposal lines 2025-12-04 10:35:42 +01:00
Florian HENRY
a38ffa02ac fix: subtotal feature button availablity according setup 2025-12-04 10:18:01 +01:00
Eric - CAP-REL
2ebdcfda5c Merge pull request #35788 from Easya-Solutions/18_allow_credit_invoice_on_situation
FIX : remove useless condition to create credit on situation invoice …
2025-12-04 09:56:30 +01:00
Eric - CAP-REL
70431043af Merge pull request #36398 from Easya-Solutions/18.0_fix-invoice-card-variables
FIX undefined variables on create invoice from shipment card (backport from v20)
2025-12-04 09:30:56 +01:00
lvessiller-opendsi
ad37ece7bc Merge pull request #36494 from atm-florianm/FIX/155/date/minute-second-vs-min-sec
FIX 18.0: `GETPOSTDATE()` and `buildParamDate()` assumed wrong HTTP param names
2025-12-04 09:27:44 +01:00
Jon Bendtsen
11cd186e9a remove debugging dol_syslog 2025-12-03 21:54:33 +01:00
Jon Bendtsen
8dc2eb0fe4 Checking for access to both new and old socid 2025-12-03 21:52:35 +01:00
Jon Bendtsen
66d3df4cc6 Fix broken commit 9801f02 mentioned in issue #36507 2025-12-03 21:06:13 +01:00
atm-florian
a1476fd221 SEC: permissions not checked on other tabs of HRM evaluation card 2025-12-03 17:11:14 +01:00
Lucas Marcouiller
59ccde0087 Merge branch '22.0' into fix-#36475 2025-12-03 09:49:23 +01:00
Jon Bendtsen
268996c672 testing for access to the thirdpartytmp 2025-12-02 17:26:53 +01:00
Jon Bendtsen
ddd2927e31 This commit has errors, if you use PUT in the API with a new socid that the user does not have permission to, then it STILL updates the contract, and then it gets the contract after update and tells me I do not have access 2025-12-02 17:23:26 +01:00
Jon Bendtsen
b48fed1719 PUT now checks both existing socid and any potentially updated socid for access 2025-12-02 17:23:26 +01:00
Jon Bendtsen
26a39d1cc8 creating Thirdparties object takes no arguments 2025-12-02 17:23:26 +01:00
Jon Bendtsen
6f18235bab both socid exists and access to is checked in api_thirdparty GET :-) 2025-12-02 17:23:26 +01:00
Jon Bendtsen
1c697607b1 default deny access, allow access if user has the right combination of permissions and/or is the sales representative for the thirdparty 2025-12-02 17:23:26 +01:00
Jon Bendtsen
36415f1fd2 giving a slight better error message 2025-12-02 17:23:26 +01:00
Jon Bendtsen
9941a20fa8 Check if API user has rights to see all thirdparties
Check if API user has rights to see all thirdparties - though perhaps we should check if the user has rights to this particular thirdparty in this contract?
2025-12-02 17:23:26 +01:00
tcesar
6545957cbd Fix traduction for import error 2025-12-02 16:37:30 +01:00
Laurent Destailleur
7828311250 Fix export pb in br 2025-12-02 15:04:14 +01:00
Laurent Destailleur
efd58a5f48 Merge branch '22.0' of git@github.com:Dolibarr/dolibarr.git into 22.0 2025-12-02 14:54:22 +01:00
Laurent Destailleur
6fbc380e52 FIX Export of extrafield in organized events 2025-12-02 14:54:10 +01:00
Laurent Destailleur
14c949c8c9 Merge pull request #36408 from JonBendtsen/security.lib.php_checkUserAccessToObject_moduleEnabled_0permissions
Qual: DENY access to Thirdparty when module is enabled, but no permissions at all
2025-12-02 10:46:46 +01:00
Lucas Marcouiller
894bbd5786 Merge branch '22.0' into fix-#36475 2025-12-02 08:36:25 +01:00
Lucas Marcouiller
55977d16f1 fix warning 2025-12-02 08:35:53 +01:00
Lucas Marcouiller
792070b5f5 fix a potential warning 2025-12-02 08:34:41 +01:00
Laurent Destailleur
64bab261a9 Merge pull request #36495 from mapiolca/patch-67
Backport: fix intervention “Signed” confirmation when no status is selected
2025-12-01 16:47:51 +01:00
Pierre Ardoin
1c94462405 Update copyright year for Pierre Ardoin 2025-12-01 14:03:40 +01:00
Pierre Ardoin
dad4bbddd2 Report fix on 21.0
Fix an issue that have been fixed by Charlene Benke on v22
2025-12-01 14:00:38 +01:00
atm-florian
0e1c580f11 FIX 18.0: GETPOSTDATE and buildParamDate assumed HTTP param names 'minute' and 'second' instead of 'min' and 'sec' 2025-12-01 13:47:50 +01:00
Laurent Destailleur
a96727726e Merge pull request #36488 from BenjaminFlr/35411
FIX(tasks): dates in ganttview
2025-12-01 13:14:03 +01:00
Laurent Destailleur
9cd4c05f5b Merge pull request #36486 from JonBendtsen/API_Timespent_Service_Field_33899
FIX: API task getTimeSpent to actually return data
2025-12-01 13:13:03 +01:00
Laurent Destailleur
4223ff08ce Merge pull request #36491 from Easya-Solutions/18.0_fix-update-extras
FIX not remove value of others extra-fields on update extras action
2025-12-01 13:10:08 +01:00
VESSILLER
d16f8b68db FIX not remove value of others extra-fields on update extras action 2025-12-01 11:14:16 +01:00
Benjamin Falière
819453b546 FIX (tasks): dates in gantt view 2025-11-30 13:21:13 +01:00
Jon Bendtsen
9801f022f9 PHPStan fix 2025-11-30 12:09:08 +01:00
Jon Bendtsen
f7fee10e23 1 more pre-commit check fix 2025-11-30 12:03:57 +01:00
Jon Bendtsen
579f1ab1f7 actual pre-commit fix 2025-11-30 11:59:59 +01:00
Jon Bendtsen
bd31e922c8 letting API TASK PUT timespent update the product 2025-11-30 11:59:47 +01:00
Jon Bendtsen
6676171146 fix pre-commit CI check 2025-11-30 11:35:39 +01:00
Jon Bendtsen
58afc38ec4 API POST can now include a product_id 2025-11-30 11:30:01 +01:00
Jon Bendtsen
9a47931329 FIX: API task getTimeSpent to actually return data 2025-11-30 11:04:34 +01:00
Laurent Destailleur
dbd98af0c3 Merge pull request #36485 from JonBendtsen/API_Timespent_Service_Field_33899
FIX #33899 API Timespent Service Field
2025-11-30 10:25:51 +01:00
Jon Bendtsen
18d8cfd510 making a more general fix for checking access to projet_task 2025-11-30 09:35:05 +01:00
Jon Bendtsen
9b0732dd49 FIX: #33899 API Timespent Service Field 2025-11-30 00:02:34 +01:00
Lucas Marcouiller
8664f74154 Fix #36475 bad value for project gantt start 2025-11-29 21:55:45 +01:00
Laurent Destailleur
f4bcf47008 Merge pull request #36467 from emheyarssi/35061
FIX #35061
2025-11-29 11:28:03 +01:00
marc
5c6b4f62c8 FIX #35061
Signed-off-by: marc <marc.baur@ptmsoft.fr>
2025-11-28 18:25:00 +01:00
Laurent Destailleur
d8891130f5 Merge pull request #36463 from vold-lu/18.0
NEW: Automatically release docker image for each GitHub release
2025-11-28 18:13:47 +01:00
Aloïs Micard
b2f9de7489 Add new workflow to trigger Docker build 2025-11-28 17:27:32 +01:00
Laurent Destailleur
2dcdf773d0 Merge pull request #36400 from atm-jonathan/FIX/ADD_NOCRFCHECK_TO_PASSWORD_FORGOTTEN
Fix: Allow password reset link when CSRF protection is strict
2025-11-26 22:43:31 +01:00
Laurent Destailleur
63cc9127ba Merge pull request #36434 from atm-lucasmantegari/FIX/ErrorFieldFilterInEvaluation
FIX - Missing AND on fields filter on evaluation class
2025-11-26 22:27:03 +01:00
Laurent Destailleur
097168cb05 Merge branch '21.0' into FIX/ErrorFieldFilterInEvaluation 2025-11-26 22:12:22 +01:00
Laurent Destailleur
f1971e1d14 Merge branch '21.0' of git@github.com:Dolibarr/dolibarr.git into 22.0 2025-11-26 22:11:31 +01:00
Laurent Destailleur
5103e2d846 Merge branch '21.0' of git@github.com:Dolibarr/dolibarr.git into 22.0 2025-11-26 22:11:31 +01:00
Laurent Destailleur
9e44c0a5c9 Fix CI 2025-11-26 22:11:09 +01:00
Laurent Destailleur
f3b467a9ba Merge branch '21.0' into FIX/ErrorFieldFilterInEvaluation 2025-11-26 22:03:40 +01:00
ATM-Lucas
4585facfcc Missing AND on fields filter on evaluation class 2025-11-26 16:47:32 +01:00
Adrien Raze
c1c2358e75 FIX : Implementation of multi-company compatibility with inventory/warehouse management 2025-11-26 12:30:22 +01:00
atm-jonathan
b2bb2fea1b Fix: use main.inc.php whitelist instead of defining NOCSRFCHECK locally 2025-11-26 11:11:56 +01:00
Jon Bendtsen
5a5764d73c remove whitespace 2025-11-25 19:28:34 +01:00
Laurent Destailleur
e9a8a4efca Update security.lib.php 2025-11-25 18:50:47 +01:00
Jon Bendtsen
3f90e51792 fix too many parentasies 2025-11-25 18:50:47 +01:00
Jon Bendtsen
966a69bab0 Qual: DENY access to Thirdparty when module is enabled, but no permissions at all 2025-11-25 18:50:47 +01:00
x
b4b202cb18 add nocrfcheck 2025-11-24 15:06:34 +01:00
VESSILLER
1cd3ca3222 FIX undefined variables on create invoice from shipment card (backport from v20) 2025-11-24 10:30:08 +01:00
tnegre
8ddf9f6075 FIX : remove useless condition to create credit on situation invoice (#35786) 2025-10-16 11:57:49 +02:00
36 changed files with 360 additions and 107 deletions

24
.github/workflows/ci-on-release.yml vendored Normal file
View File

@@ -0,0 +1,24 @@
name: "CI-RELEASE"
on:
release:
types: [published]
jobs:
trigger-docker:
runs-on: ubuntu-latest
steps:
- name: Generate a token
id: generate-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ vars.RELEASE_DOCKER_ID }}
private-key: ${{ secrets.RELEASE_DOCKER_SECRET }}
- uses: peter-evans/repository-dispatch@v4
with:
token: ${{ steps.generate-token.outputs.token }}
repository: Dolibarr/dolibarr-docker
event-type: new-release
client-payload: '{"version": "${{ github.event.release.tag_name }}"}'

View File

@@ -429,6 +429,7 @@ class AccountingJournal extends CommonObject
$sql .= " FROM " . MAIN_DB_PREFIX . "asset_depreciation as ad";
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "asset as a ON a.rowid = ad.fk_asset";
$sql .= " WHERE a.entity IN (" . getEntity('asset', 0) . ')'; // We don't share object for accountancy, we use source object sharing
$sql .= " AND a.status > 0";
if ($in_bookkeeping == 'already') {
$sql .= " AND EXISTS (SELECT iab.fk_docdet FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping AS iab WHERE iab.fk_docdet = ad.rowid AND doc_type = 'asset')";
} elseif ($in_bookkeeping == 'notyet') {

View File

@@ -1,6 +1,7 @@
<?php
/* Copyright (C) 2021 Open-Dsi <support@open-dsi.fr>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
/* Copyright (C) 2021 Open-Dsi <support@open-dsi.fr>
* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2025 Alexandre Spangaro <alexandre@inovea-conseil.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
@@ -68,8 +69,8 @@ class AssetAccountancyCodes extends CommonObject
'economic' => array(
'label' => 'AssetAccountancyCodeDepreciationEconomic',
'table' => 'asset_accountancy_codes_economic',
'depreciation_debit' => 'depreciation_asset',
'depreciation_credit' => 'depreciation_expense',
'depreciation_debit' => 'depreciation_expense',
'depreciation_credit' => 'depreciation_asset',
'fields' => array(
'asset' => array('label' => 'AssetAccountancyCodeAsset'),
'depreciation_asset' => array('label' => 'AssetAccountancyCodeDepreciationAsset'),
@@ -84,8 +85,8 @@ class AssetAccountancyCodes extends CommonObject
'accelerated_depreciation' => array(
'label' => 'AssetAccountancyCodeDepreciationAcceleratedDepreciation',
'table' => 'asset_accountancy_codes_fiscal',
'depreciation_debit' => 'accelerated_depreciation',
'depreciation_credit' => 'endowment_accelerated_depreciation',
'depreciation_debit' => 'endowment_accelerated_depreciation',
'depreciation_credit' => 'accelerated_depreciation',
'fields' => array(
'accelerated_depreciation' => array('label' => 'AssetAccountancyCodeAcceleratedDepreciation'),
'endowment_accelerated_depreciation' => array('label' => 'AssetAccountancyCodeEndowmentAcceleratedDepreciation'),

View File

@@ -19,6 +19,7 @@
* Copyright (C) 2023 William Mead <william.mead@manchenumerique.fr>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
* Copyright (C) 2025 Benjamin Falière <benjamin@faliere.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
@@ -1932,6 +1933,12 @@ if (empty($reshook)) {
$type = $product->type;
$price_base_type = $product->price_base_type;
// If base type TTc, we change pu value to define the TTC one
if ($price_base_type == 'TTC' && !empty($pu_ttc)) {
$pu = $pu_ttc;
}
$label = ((GETPOST('update_label') && GETPOST('product_label')) ? GETPOST('product_label') : '');
$price_min = $product->price_min;
@@ -3456,14 +3463,15 @@ if ($action == 'create') {
if (empty($reshook)) {
if ($action != 'editline') {
// Subtotal
if ($object->status == Propal::STATUS_DRAFT && isModEnabled('subtotals') && getDolGlobalString('SUBTOTAL_TITLE_'.strtoupper($object->element))) {
if ($object->status == Propal::STATUS_DRAFT && isModEnabled('subtotals')
&& (getDolGlobalInt('SUBTOTAL_TITLE_'.strtoupper($object->element)) || getDolGlobalInt('SUBTOTAL_'.strtoupper($object->element)))) {
$langs->load('subtotals');
$url_button = array();
$url_button[] = array(
'lang' => 'subtotals',
'enabled' => (isModEnabled('propal') && $object->status == Propal::STATUS_DRAFT),
'enabled' => (isModEnabled('propal') && $object->status == Propal::STATUS_DRAFT && getDolGlobalInt('SUBTOTAL_TITLE_'.strtoupper($object->element))),
'perm' => (bool) $usercancreate,
'label' => $langs->trans('AddTitleLine'),
'url' => '/comm/propal/card.php?id='.$object->id.'&action=add_title_line&token='.newToken()
@@ -3471,7 +3479,7 @@ if ($action == 'create') {
$url_button[] = array(
'lang' => 'subtotals',
'enabled' => (isModEnabled('propal') && $object->status == Propal::STATUS_DRAFT),
'enabled' => (isModEnabled('propal') && $object->status == Propal::STATUS_DRAFT && getDolGlobalInt('SUBTOTAL_'.strtoupper($object->element))),
'perm' => (bool) $usercancreate,
'label' => $langs->trans('AddSubtotalLine'),
'url' => '/comm/propal/card.php?id='.$object->id.'&action=add_subtotal_line&token='.newToken()

View File

@@ -18,8 +18,8 @@
* Copyright (C) 2022 ATM Consulting <contact@atm-consulting.fr>
* Copyright (C) 2022 OpenDSI <support@open-dsi.fr>
* Copyright (C) 2022 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
* Copyright (C) 2023 William Mead <william.mead@manchenumerique.fr>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2025 William Mead <william@m34d.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
@@ -1909,11 +1909,14 @@ class Propal extends CommonObject
$sql .= " fk_statut = ".(isset($this->status) ? (int) $this->status : "null").",";
$sql .= " fk_user_author = ".(!empty($this->user_author_id) ? (int) $this->user_author_id : "null").",";
$sql .= " fk_user_valid = ".(!empty($this->user_validation_id) ? (int) $this->user_validation_id : "null").",";
$sql .= " fk_projet = ".(!empty($this->fk_project) ? (int) $this->fk_project : "null").",";
$sql .= " fk_cond_reglement = ".(!empty($this->cond_reglement_id) ? (int) $this->cond_reglement_id : "null").",";
$sql .= " deposit_percent = ".(!empty($this->deposit_percent) ? "'".$this->db->escape($this->deposit_percent)."'" : "null").",";
$sql .= " fk_mode_reglement = ".(!empty($this->mode_reglement_id) ? (int) $this->mode_reglement_id : "null").",";
$sql .= " fk_input_reason = ".(!empty($this->demand_reason_id) ? (int) $this->demand_reason_id : "null").",";
$sql .= " fk_shipping_method=".(isset($this->shipping_method_id) ? (int) $this->shipping_method_id : "null").",";
$sql .= " fk_availability=".(isset($this->availability_id) ? (int) $this->availability_id : "null").",";
$sql .= " note_private = ".(isset($this->note_private) ? "'".$this->db->escape($this->note_private)."'" : "null").",";
$sql .= " note_public = ".(isset($this->note_public) ? "'".$this->db->escape($this->note_public)."'" : "null").",";
$sql .= " model_pdf = ".(isset($this->model_pdf) ? "'".$this->db->escape($this->model_pdf)."'" : "null").",";

View File

@@ -3445,14 +3445,15 @@ if ($action == 'create' && $usercancreate) {
}
// Subtotal
if ($object->status == Commande::STATUS_DRAFT && isModEnabled('subtotals') && getDolGlobalString('SUBTOTAL_TITLE_'.strtoupper($object->element))) {
if ($object->status == Commande::STATUS_DRAFT && isModEnabled('subtotals')
&& (getDolGlobalInt('SUBTOTAL_TITLE_'.strtoupper($object->element)) || getDolGlobalInt('SUBTOTAL_'.strtoupper($object->element)))) {
$langs->load('subtotals');
$url_button = array();
$url_button[] = array(
'lang' => 'subtotals',
'enabled' => (isModEnabled('order') && $object->status == Commande::STATUS_DRAFT),
'enabled' => (isModEnabled('order') && $object->status == Commande::STATUS_DRAFT && getDolGlobalInt('SUBTOTAL_TITLE_'.strtoupper($object->element))),
'perm' => (bool) $usercancreate,
'label' => $langs->trans('AddTitleLine'),
'url' => '/commande/card.php?id='.$object->id.'&action=add_title_line&token='.newToken()
@@ -3460,7 +3461,7 @@ if ($action == 'create' && $usercancreate) {
$url_button[] = array(
'lang' => 'subtotals',
'enabled' => (isModEnabled('order') && $object->status == Commande::STATUS_DRAFT),
'enabled' => (isModEnabled('order') && $object->status == Commande::STATUS_DRAFT && getDolGlobalInt('SUBTOTAL_'.strtoupper($object->element))),
'perm' => (bool) $usercancreate,
'label' => $langs->trans('AddSubtotalLine'),
'url' => '/commande/card.php?id='.$object->id.'&action=add_subtotal_line&token='.newToken()

View File

@@ -606,6 +606,13 @@ if (empty($reshook)) {
$lines[$i]->fk_unit
);
if ($result > 0) {
if (!empty($lines[$i]->extraparams)) {
$factureLine = new FactureLigne($db);
$factureLine->id = $result;
$factureLine->extraparams = $lines[$i]->extraparams;
$factureLine->setExtraParameters();
}
$lineid = $result;
} else {
$lineid = 0;

View File

@@ -2076,14 +2076,15 @@ if ($action == 'create') {
);
// Subtotal
if (empty($object->suspended) && isModEnabled('subtotals') && getDolGlobalString('SUBTOTAL_TITLE_'.strtoupper($object->element))) {
if (empty($object->suspended) && isModEnabled('subtotals')
&& (getDolGlobalInt('SUBTOTAL_TITLE_'.strtoupper($object->element)) || getDolGlobalInt('SUBTOTAL_'.strtoupper($object->element)))) {
$langs->load("subtotals");
$url_button = array();
$url_button[] = array(
'lang' => 'subtotals',
'enabled' => (isModEnabled('invoice') && $object->status == Facture::STATUS_DRAFT),
'enabled' => (isModEnabled('invoice') && $object->status == Facture::STATUS_DRAFT && getDolGlobalInt('SUBTOTAL_TITLE_'.strtoupper($object->element))),
'perm' => (bool) $usercancreate,
'label' => $langs->trans('AddTitleLine'),
'url' => '/compta/facture/card-rec.php?id='.$object->id.'&action=add_title_line&token='.newToken()
@@ -2091,7 +2092,7 @@ if ($action == 'create') {
$url_button[] = array(
'lang' => 'subtotals',
'enabled' => (isModEnabled('invoice') && $object->status == Facture::STATUS_DRAFT),
'enabled' => (isModEnabled('invoice') && $object->status == Facture::STATUS_DRAFT && getDolGlobalInt('SUBTOTAL_'.strtoupper($object->element))),
'perm' => (bool) $usercancreate,
'label' => $langs->trans('AddSubtotalLine'),
'url' => '/compta/facture/card-rec.php?id='.$object->id.'&action=add_subtotal_line&token='.newToken()

View File

@@ -6390,14 +6390,15 @@ if ($action == 'create') {
}
// Subtotal
if ($object->status == Facture::STATUS_DRAFT && isModEnabled('subtotals') && getDolGlobalString('SUBTOTAL_TITLE_'.strtoupper($object->element))) {
if ($object->status == Facture::STATUS_DRAFT && isModEnabled('subtotals')
&& (getDolGlobalInt('SUBTOTAL_TITLE_'.strtoupper($object->element)) || getDolGlobalInt('SUBTOTAL_'.strtoupper($object->element)))) {
$langs->load("subtotals");
$url_button = array();
$url_button[] = array(
'lang' => 'subtotals',
'enabled' => (isModEnabled('invoice') && $object->status == Facture::STATUS_DRAFT),
'enabled' => (isModEnabled('invoice') && $object->status == Facture::STATUS_DRAFT && getDolGlobalInt('SUBTOTAL_TITLE_'.strtoupper($object->element))),
'perm' => (bool) $usercancreate,
'label' => $langs->trans('AddTitleLine'),
'url' => '/compta/facture/card.php?facid='.$object->id.'&action=add_title_line&token='.newToken()
@@ -6405,7 +6406,7 @@ if ($action == 'create') {
$url_button[] = array(
'lang' => 'subtotals',
'enabled' => (isModEnabled('invoice') && $object->status == Facture::STATUS_DRAFT),
'enabled' => (isModEnabled('invoice') && $object->status == Facture::STATUS_DRAFT && getDolGlobalInt('SUBTOTAL_'.strtoupper($object->element))),
'perm' => (bool) $usercancreate,
'label' => $langs->trans('AddSubtotalLine'),
'url' => '/compta/facture/card.php?facid='.$object->id.'&action=add_subtotal_line&token='.newToken()
@@ -6558,7 +6559,7 @@ if ($action == 'create') {
}
}
// For situation invoice with excess received
// For situation invoice
if ($object->status > Facture::STATUS_DRAFT
&& $object->isSituationInvoice()
&& ($object->total_ttc - $totalpaid - $totalcreditnotes - $totaldeposits) > 0

View File

@@ -21,6 +21,7 @@
use Luracast\Restler\RestException;
require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php';
require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
/**
* API class for contracts
@@ -76,7 +77,7 @@ class Contracts extends DolibarrApi
}
if (!DolibarrApi::_checkAccessToResource('contrat', $this->contract->id)) {
throw new RestException(403, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
throw new RestException(403, 'Access to this contract is not allowed for login '.DolibarrApiAccess::$user->login);
}
$this->contract->fetchObjectLinked();
@@ -158,7 +159,6 @@ class Contracts extends DolibarrApi
$sql .= $this->db->plimit($limit + 1, $offset);
}
dol_syslog("API Rest request");
$result = $this->db->query($sql);
if ($result) {
@@ -208,8 +208,19 @@ class Contracts extends DolibarrApi
public function post($request_data = null)
{
if (!DolibarrApiAccess::$user->hasRight('contrat', 'creer')) {
throw new RestException(403, "Insufficient rights");
throw new RestException(403, "Missing permission: Create/modify contracts/subscriptions");
}
$socid = (int) $request_data['socid'];
$thirdpartytmp = new Societe($this->db);
$thirdparty_result = $thirdpartytmp->fetch($socid);
if ($thirdparty_result < 1) {
throw new RestException(404, 'Thirdparty with id='.$socid.' not found or not allowed');
}
if (!DolibarrApi::_checkAccessToResource('societe', $thirdpartytmp->id)) {
throw new RestException(404, 'Thirdparty with id='.$thirdpartytmp->id.' not found or not allowed');
}
// Check mandatory fields
$result = $this->_validate($request_data);
@@ -268,7 +279,7 @@ class Contracts extends DolibarrApi
}
if (!DolibarrApi::_checkAccessToResource('contrat', $this->contract->id)) {
throw new RestException(403, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
throw new RestException(403, 'Access to this contract is not allowed for login '.DolibarrApiAccess::$user->login);
}
$obj_ret = [];
@@ -300,7 +311,6 @@ class Contracts extends DolibarrApi
$sql .= $this->db->plimit($limit + 1, $offset);
}
dol_syslog("API Rest request");
$result = $this->db->query($sql);
if ($result) {
$num = $this->db->num_rows($result);
@@ -360,7 +370,7 @@ class Contracts extends DolibarrApi
}
if (!DolibarrApi::_checkAccessToResource('contrat', $this->contract->id)) {
throw new RestException(403, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
throw new RestException(403, 'Access to this contract is not allowed for login '.DolibarrApiAccess::$user->login);
}
$request_data = (object) $request_data;
@@ -420,7 +430,7 @@ class Contracts extends DolibarrApi
}
if (!DolibarrApi::_checkAccessToResource('contrat', $this->contract->id)) {
throw new RestException(403, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
throw new RestException(403, 'Access to this contract is not allowed for login '.DolibarrApiAccess::$user->login);
}
$request_data = (object) $request_data;
@@ -568,7 +578,7 @@ class Contracts extends DolibarrApi
}
if (!DolibarrApi::_checkAccessToResource('contrat', $this->contract->id)) {
throw new RestException(403, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
throw new RestException(403, 'Access to this contract is not allowed for login '.DolibarrApiAccess::$user->login);
}
$updateRes = $this->contract->active_line(DolibarrApiAccess::$user, $lineid, (int) $datestart, $dateend, $comment);
@@ -606,7 +616,7 @@ class Contracts extends DolibarrApi
}
if (!DolibarrApi::_checkAccessToResource('contrat', $this->contract->id)) {
throw new RestException(403, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
throw new RestException(403, 'Access to this contract is not allowed for login '.DolibarrApiAccess::$user->login);
}
$updateRes = $this->contract->close_line(DolibarrApiAccess::$user, $lineid, (int) $datestart, $comment);
@@ -646,7 +656,7 @@ class Contracts extends DolibarrApi
}
if (!DolibarrApi::_checkAccessToResource('contrat', $this->contract->id)) {
throw new RestException(403, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
throw new RestException(403, 'Access to this contract is not allowed for login '.DolibarrApiAccess::$user->login);
}
// TODO Check the lineid $lineid is a line of object
@@ -673,14 +683,23 @@ class Contracts extends DolibarrApi
if (!DolibarrApiAccess::$user->hasRight('contrat', 'creer')) {
throw new RestException(403);
}
$result = $this->contract->fetch($id);
if (!$result) {
throw new RestException(404, 'Contrat not found');
}
$old_socid = $this->contract->socid;
$oldthirdpartytmp = new Societe($this->db);
$old_thirdparty_result = $oldthirdpartytmp->fetch($old_socid);
if ($old_thirdparty_result < 1) {
throw new RestException(404, 'Thirdparty with id='.$old_socid.' not found or not allowed');
}
if (!DolibarrApi::_checkAccessToResource('societe', $old_socid)) {
throw new RestException(403, 'Access to old thirdparty='.$old_socid.' is not allowed for login '.DolibarrApiAccess::$user->login);
}
if (!DolibarrApi::_checkAccessToResource('contrat', $this->contract->id)) {
throw new RestException(403, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
throw new RestException(403, 'Access to this contract is not allowed for login '.DolibarrApiAccess::$user->login);
}
foreach ($request_data as $field => $value) {
if ($field == 'id') {
@@ -698,6 +717,18 @@ class Contracts extends DolibarrApi
continue;
}
if ($field == 'socid') {
$new_socid = (int) $value;
$loopthirdpartytmp = new Societe($this->db);
$new_thirdparty_result = $loopthirdpartytmp->fetch($new_socid);
if ($new_thirdparty_result < 1) {
throw new RestException(404, 'Thirdparty with id='.$new_socid.' not found or not allowed');
}
if (!DolibarrApi::_checkAccessToResource('societe', $new_socid)) {
throw new RestException(403, 'Access to new thirdparty='.$new_socid.' is not allowed for login '.DolibarrApiAccess::$user->login);
}
}
$this->contract->$field = $this->_checkValForAPI($field, $value, $this->contract);
}
@@ -720,7 +751,7 @@ class Contracts extends DolibarrApi
public function delete($id)
{
if (!DolibarrApiAccess::$user->hasRight('contrat', 'supprimer')) {
throw new RestException(403);
throw new RestException(403, 'Missing permission: Delete contracts/subscriptions');
}
$result = $this->contract->fetch($id);
if (!$result) {
@@ -728,7 +759,7 @@ class Contracts extends DolibarrApi
}
if (!DolibarrApi::_checkAccessToResource('contrat', $this->contract->id)) {
throw new RestException(403, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
throw new RestException(403, 'Access to this contract is not allowed for login '.DolibarrApiAccess::$user->login);
}
if (!$this->contract->delete(DolibarrApiAccess::$user)) {
@@ -773,7 +804,7 @@ class Contracts extends DolibarrApi
}
if (!DolibarrApi::_checkAccessToResource('contrat', $this->contract->id)) {
throw new RestException(403, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
throw new RestException(403, 'Access to this contract is not allowed for login '.DolibarrApiAccess::$user->login);
}
$result = $this->contract->validate(DolibarrApiAccess::$user, '', $notrigger);
@@ -822,7 +853,7 @@ class Contracts extends DolibarrApi
}
if (!DolibarrApi::_checkAccessToResource('contrat', $this->contract->id)) {
throw new RestException(403, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
throw new RestException(403, 'Access to this contract is not allowed for login '.DolibarrApiAccess::$user->login);
}
$result = $this->contract->closeAll(DolibarrApiAccess::$user, $notrigger);

View File

@@ -57,6 +57,9 @@ class CLeadStatus extends CommonDict
*/
public $percent;
/**
* @var array<string,array{type:string,label:string,enabled:int<0,2>|string,position:int,notnull?:int,visible:int<-5,5>|string,alwayseditable?:int<0,1>,noteditable?:int<0,1>,default?:string,index?:int,foreignkey?:string,searchall?:int<0,1>,isameasure?:int<0,1>,css?:string,csslist?:string,help?:string,showoncombobox?:int<0,4>,disabled?:int<0,1>,arrayofkeyval?:array<int|string,string>,autofocusoncreate?:int<0,1>,comment?:string,copytoclipboard?:int<1,2>,validate?:int<0,1>,showonheader?:int<0,1>}>
*/
public $fields = array(
'rowid' => array('type' => 'integer', 'label' => 'TechnicalID', 'enabled' => 1, 'position' => 1, 'notnull' => 1, 'visible' => 0, 'noteditable' => 1, 'index' => 1, 'css' => 'left', 'comment' => "Id"),
'label' => array('type' => 'varchar(128)', 'label' => 'Label', 'enabled' => 1, 'position' => 20, 'notnull' => 1, 'visible' => 1, 'index' => 1, 'searchall' => 1, 'showoncombobox' => 1, 'comment' => "Label of status"),

View File

@@ -818,7 +818,9 @@ class FormFile
$out .= '<input type="hidden" name="page_y" value="">';
$out .= '<input type="hidden" name="token" value="'.newToken().'">';
$out .= load_fiche_titre($titletoshow, '', '');
if ($titletoshow) {
$out .= load_fiche_titre($titletoshow, '', '');
}
$out .= '<div class="div-table-responsive-no-min">';
$out .= '<table class="liste formdoc noborder centpercent">';

View File

@@ -105,6 +105,7 @@ class TimeSpent extends CommonObject
*/
public $fields = array(
'rowid' => array('type' => 'integer', 'label' => 'TechnicalID', 'enabled' => 1, 'position' => 1, 'notnull' => 1, 'visible' => 0, 'noteditable' => 1, 'index' => 1, 'css' => 'left', 'comment' => "Id"),
'ref_ext' => array('type' => 'varchar(255)', 'label' => 'RefExt', 'enabled' => 1, 'visible' => 0, 'position' => 20),
'tms' => array('type' => 'timestamp', 'label' => 'DateModification', 'enabled' => 1, 'position' => 17, 'notnull' => 0, 'visible' => -2,),
'import_key' => array('type' => 'varchar(14)', 'label' => 'import_key', 'enabled' => 1, 'position' => 15, 'notnull' => 0, 'visible' => -1,),
'fk_element' => array('type' => 'integer', 'label' => 'fk_element', 'enabled' => 1, 'position' => 2, 'notnull' => 1, 'visible' => -1,),

View File

@@ -299,7 +299,7 @@ function getDefaultDatesForTransfer()
$obj = $db->fetch_object($res);
$date_start = $db->jdate($obj->date_start);
$date_end = $db->jdate($obj->date_end);
$date_end = dol_get_last_hour($db->jdate($obj->date_end));
} else {
$month_start = getDolGlobalInt('SOCIETE_FISCAL_MONTH_START', 1);
$year_start = (int) dol_print_date(dol_now(), '%Y');
@@ -313,7 +313,8 @@ function getDefaultDatesForTransfer()
$year_end--;
}
$date_start = dol_mktime(0, 0, 0, $month_start, 1, $year_start);
$date_end = dol_get_last_day($year_end, $month_end);
$lastday = dol_get_last_day($year_end, $month_end);
$date_end = dol_mktime(23, 59, 59, $month_end, (int) dol_print_date($lastday, '%d'), $year_end);
}
} elseif ($periodbydefaultontransfer == 1) { // current month
$year_current = (int) dol_print_date(dol_now('gmt'), "%Y", 'gmt');

View File

@@ -1225,7 +1225,7 @@ function GETPOSTDATE($prefix, $hourTime = '', $gm = 'auto', $saverestore = '')
if ($hourTime === 'getpost' || $hourTime === 'getpostend') {
$hour = (GETPOSTISSET($prefix . 'hour') && GETPOSTINT($prefix . 'hour') >= 0) ? GETPOSTINT($prefix . 'hour') : ($hourTime === 'getpostend' ? 23 : 0);
$minute = (GETPOSTISSET($prefix . 'min') && GETPOSTINT($prefix . 'min') >= 0) ? GETPOSTINT($prefix . 'min') : ($hourTime === 'getpostend' ? 59 : 0);
$second = (GETPOSTISSET($prefix . 'second') && GETPOSTINT($prefix . 'second') >= 0) ? GETPOSTINT($prefix . 'second') : ($hourTime === 'getpostend' ? 59 : 0);
$second = (GETPOSTISSET($prefix . 'sec') && GETPOSTINT($prefix . 'sec') >= 0) ? GETPOSTINT($prefix . 'sec') : ($hourTime === 'getpostend' ? 59 : 0);
} elseif (preg_match('/^(\d\d):(\d\d):(\d\d)$/', $hourTime, $m)) {
$hour = intval($m[1]);
$minute = intval($m[2]);
@@ -15811,8 +15811,8 @@ function buildParamDate($prefix, $timestamp = null, $hourTime = '', $gm = 'auto'
if ($hourTime === 'getpost' || ($timestamp !== null && dol_print_date($timestamp, '%H:%M:%S') !== '00:00:00')) {
$TParam = array_merge($TParam, array(
$prefix . 'hour' => intval(dol_print_date($timestamp, '%H')),
$prefix . 'minute' => intval(dol_print_date($timestamp, '%M')),
$prefix . 'second' => intval(dol_print_date($timestamp, '%S'))
$prefix . 'min' => intval(dol_print_date($timestamp, '%M')),
$prefix . 'sec' => intval(dol_print_date($timestamp, '%S'))
));
}

View File

@@ -976,6 +976,7 @@ function checkUserAccessToObject($user, array $featuresarray, $object = 0, $tabl
}
if ($feature == 'task' || $feature == 'projet_task') {
$feature = 'project_task';
$dbtablename = 'projet_task';
}
if ($feature == 'eventorganization') {
$feature = 'agenda';
@@ -992,14 +993,14 @@ function checkUserAccessToObject($user, array $featuresarray, $object = 0, $tabl
$checkonentitydone = 0;
// Array to define rules of checks to do
$check = array('adherent', 'banque', 'bom', 'don', 'mrp', 'user', 'usergroup', 'payment', 'payment_supplier', 'payment_sc', 'product', 'produit', 'service', 'produit|service', 'categorie', 'resource', 'expensereport', 'holiday', 'salaries', 'website', 'recruitment', 'chargesociales', 'knowledgemanagement'); // Test on entity only (Objects with no link to company)
$check = array('adherent', 'banque', 'bom', 'don', 'mrp', 'user', 'usergroup', 'payment', 'payment_supplier', 'payment_sc', 'product', 'produit', 'service', 'produit|service', 'categorie', 'resource', 'expensereport', 'holiday', 'salaries', 'website', 'recruitment', 'chargesociales', 'knowledgemanagement', 'stock'); // Test on entity only (Objects with no link to company)
$checksoc = array('societe'); // Test for object Societe
$checkparentsoc = array('agenda', 'contact', 'contrat'); // Test on entity + link to third party on field $dbt_keyfield. Allowed if link is empty (Ex: contacts...).
$checkproject = array('projet', 'project'); // Test for project object
$checktask = array('projet_task', 'project_task'); // Test for task object
$checkhierarchy = array('expensereport', 'holiday', 'hrm'); // check permission among the hierarchy of user
$checkuser = array('bookmark'); // check permission among the fk_user (must be myself or null)
$nocheck = array('barcode', 'stock'); // No test
$nocheck = array('barcode'); // No test
//$checkdefault = 'all other not already defined'; // Test on entity + link to third party on field $dbt_keyfield. Not allowed if link is empty (Ex: invoice, orders...).
@@ -1052,6 +1053,9 @@ function checkUserAccessToObject($user, array $featuresarray, $object = 0, $tabl
if ($user->socid != $objectid) {
return false;
}
} elseif (isModEnabled('societe') && !$user->hasRight('societe', 'lire') && !$user->hasRight('societe', 'client', 'voir')) {
dol_syslog("security.lib.php::checkUserAccessToObject Deny access due: (isModEnabled('societe') && !user->hasRight('societe', 'lire') && !user->hasRight('societe', 'client', 'voir'))", LOG_DEBUG);
return false;
} elseif (isModEnabled("societe") && ($user->hasRight('societe', 'lire') && !$user->hasRight('societe', 'client', 'voir'))) {
// If internal user: Check permission for internal users that are restricted on their objects
$sql = "SELECT COUNT(sc.fk_soc) as nb";
@@ -1236,7 +1240,7 @@ function checkUserAccessToObject($user, array $featuresarray, $object = 0, $tabl
// the user can't view any evaluations
return false;
}
// the user can only their own evaluations or their subordinates'
// the user can only see their own evaluations or their subordinates'
return in_array($useridtocheck, $childids);
}
}
@@ -1258,12 +1262,13 @@ function checkUserAccessToObject($user, array $featuresarray, $object = 0, $tabl
return false;
}
} else {
dol_syslog("Bad forged sql in checkUserAccessToObject", LOG_WARNING);
dol_syslog("Bad forged sql in security.lib.php::checkUserAccessToObject", LOG_WARNING);
return false;
}
}
}
dol_syslog("security.lib.php::checkUserAccessToObject::return True", LOG_DEBUG);
return true;
}

View File

@@ -339,18 +339,18 @@ class modEventOrganization extends DolibarrModules
$this->export_TypeFields_array[$r]['t.fk_soc'] = 'Numeric';
//$this->export_fields_array[$r]['t.fieldtoadd']='FieldToAdd'; $this->export_TypeFields_array[$r]['t.fieldtoadd']='Text';
//unset($this->export_fields_array[$r]['t.fieldtoremove']);
$keyforselect = 'conferenceorboothattendee';
$keyforselect = 'eventorganization_conferenceorboothattendee'; // The value in column elementtype of llx_extrafields table
$keyforaliasextra = 'extra';
$keyforelement = 'conferenceorboothattendee';
$keyforelement = 'conferenceorboothattendee'; // The value of key for icon and class
include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php';
//$this->export_dependencies_array[$r] = array('aaaline'=>array('tl.rowid','tl.ref')); // 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_special_array[$r] = array('t.field'=>'...');
//$this->export_examplevalues_array[$r] = array('t.field'=>'Example');
//$this->export_help_array[$r] = array('t.field'=>'FieldDescHelp');
$this->export_sql_start[$r] = 'SELECT DISTINCT ';
$this->export_sql_end[$r] = ' FROM '.MAIN_DB_PREFIX.'eventorganization_conferenceorboothattendee as t, '.MAIN_DB_PREFIX.'projet as p';
$this->export_sql_end[$r] .= ' WHERE t.fk_project = p.rowid';
$this->export_sql_end[$r] .= ' AND p.entity IN ('.getEntity('conferenceorboothattendee').')';
$this->export_sql_end[$r] = ' FROM '.MAIN_DB_PREFIX.'eventorganization_conferenceorboothattendee as t';
$this->export_sql_end[$r] .= ' INNER JOIN '.MAIN_DB_PREFIX.'projet as p ON t.fk_project = p.rowid AND p.entity IN ('.getEntity('conferenceorboothattendee').')';
$this->export_sql_end[$r] .= ' LEFT JOIN '.MAIN_DB_PREFIX.'eventorganization_conferenceorboothattendee_extrafields as extra on t.rowid = extra.fk_object';
$r++;
/* END MODULEBUILDER EXPORT CONFERENCEORBOOTHATTENDEES */
@@ -388,7 +388,7 @@ class modEventOrganization extends DolibarrModules
$this->export_TypeFields_array[$r]['s.nom'] = 'Text';
//$this->export_fields_array[$r]['t.fieldtoadd']='FieldToAdd'; $this->export_TypeFields_array[$r]['t.fieldtoadd']='Text';
//unset($this->export_fields_array[$r]['t.fieldtoremove']);
$keyforselect = 'conferenceorbooth';
$keyforselect = 'actioncomm'; // The value in column elementtype of llx_extrafields table
$keyforaliasextra = 'extra';
$keyforelement = 'conferenceorbooth';
include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php';
@@ -396,16 +396,13 @@ class modEventOrganization extends DolibarrModules
//$this->export_special_array[$r] = array('t.field'=>'...');
//$this->export_examplevalues_array[$r] = array('t.field'=>'Example');
//$this->export_help_array[$r] = array('t.field'=>'FieldDescHelp');
$this->export_sql_start[$r] = 'SELECT DISTINCT ';
$this->export_sql_start[$r] = "SELECT DISTINCT ";
$this->export_sql_end[$r] = ' FROM '.MAIN_DB_PREFIX.'actioncomm as t';
$this->export_sql_end[$r] .= ' LEFT JOIN '.MAIN_DB_PREFIX.'societe as s ON t.fk_soc = s.rowid,';
$this->export_sql_end[$r] .= ' '.MAIN_DB_PREFIX.'projet as p,';
$this->export_sql_end[$r] .= ' '.MAIN_DB_PREFIX.'c_actioncomm as ca';
$this->export_sql_end[$r] .= ' WHERE t.fk_project = p.rowid';
$this->export_sql_end[$r] .= ' AND ca.id = t.fk_action';
$this->export_sql_end[$r] .= " AND t.code LIKE 'AC_EO_%'";
$this->export_sql_end[$r] .= ' AND p.usage_organize_event = 1';
$this->export_sql_end[$r] .= ' AND p.entity IN ('.getEntity('conferenceorboothattendee').')';
$this->export_sql_end[$r] .= ' INNER JOIN '.MAIN_DB_PREFIX.'projet as p ON t.fk_project = p.rowid AND p.usage_organize_event = 1 AND p.entity IN ('.getEntity('conferenceorboothattendee').')';
$this->export_sql_end[$r] .= ' INNER JOIN '.MAIN_DB_PREFIX.'c_actioncomm as ca ON ca.id = t.fk_action';
$this->export_sql_end[$r] .= ' LEFT JOIN '.MAIN_DB_PREFIX.'societe as s ON t.fk_soc = s.rowid';
$this->export_sql_end[$r] .= ' LEFT JOIN '.MAIN_DB_PREFIX.'actioncomm_extrafields as extra on t.id = extra.fk_object';
$this->export_sql_end[$r] .= " WHERE t.code LIKE 'AC_EO_%'";
$r++;
/* END MODULEBUILDER EXPORT CONFERENCEORBOOTH */

View File

@@ -144,6 +144,7 @@ $entitytolang = array(
'bomline' => 'BOMLine',
'mrp' => 'ManufacturingOrder',
'mrp_line' => 'ManufacturingOrderLine',
'conferenceorbooth' => 'ConferenceOrBooth',
'conferenceorboothattendee' => 'Attendee',
'inventory' => 'Inventory',
'inventory_line' => 'InventoryLine'
@@ -1023,6 +1024,7 @@ if ($step == 4 && $datatoexport) {
// Select request if all fields are selected
$sqlmaxforexport = $objexport->build_sql(0, array(), array());
print '<br>';
print '<div class="marginbottomonly"><span class="opacitymedium">'.$langs->trans("ChooseFieldsOrdersAndTitle").'</span></div>';
print '<div class="div-table-responsive-no-min">'; // You can use div-table-responsive-no-min if you don't need reserved height for your table
@@ -1353,15 +1355,16 @@ if ($step == 5 && $datatoexport) {
}
$htmltabloflibs .= '</table><br>';
print '<br>';
print '<span class="opacitymedium">'.$form->textwithpicto($langs->trans("NowClickToGenerateToBuildExportFile"), $htmltabloflibs, 1, 'help', '', 0, 2, 'helphonformat').'</span>';
//print $htmltabloflibs;
print '<br>';
print '</div>';
if ($sqlusedforexport && $user->admin) {
print info_admin($langs->trans("SQLUsedForExport").':<br> '.$sqlusedforexport, 0, 0, '1', '', 'TechnicalInformation');
print info_admin($langs->trans("SQLUsedForExport").':<br> '.$sqlusedforexport, 0, 0, '1', '', 'TechnicalInformation').'<br>';
print '<br>';
}

View File

@@ -13,6 +13,7 @@
* Copyright (C) 2023-2024 William Mead <william.mead@manchenumerique.fr>
* Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
* Copyright (C) 2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
* Copyright (C) 2025 Pierre Ardoin <developpeur@lesmetiersdubatiment.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

View File

@@ -358,8 +358,8 @@ class CommandeFournisseurLigne extends CommonOrderLine
} else {
$sql .= "null,";
}
$sql .= "'".$this->db->escape((string) $this->product_type)."',";
$sql .= ((int) $this->special_code) . ",";
$sql .= ((int) $this->product_type).",";
$sql .= ((int) $this->special_code).",";
$sql .= "'".$this->db->escape((string) $this->rang)."',";
$sql .= "'".$this->db->escape((string) $this->qty)."', ";
$sql .= " ".(empty($this->vat_src_code) ? "''" : "'".$this->db->escape((string) $this->vat_src_code)."'").",";

View File

@@ -225,7 +225,7 @@ class Evaluation extends CommonObject
}
if (!$user->hasRight('hrm', 'evaluation', 'readall')) {
$this->fields['fk_user']['type'] .= ':t.rowid:IN:'.$this->db->sanitize(implode(",", $user->getAllChildIds(1)));
$this->fields['fk_user']['type'] .= ' AND (t.rowid:IN:'.$this->db->sanitize(implode(",", $user->getAllChildIds(1))) .')';
}
$this->date_eval = dol_now();

View File

@@ -105,8 +105,9 @@ $permissiontoread = $user->hasRight('hrm', 'evaluation', 'read'); // Used by the
// Security check (enable the most restrictive one)
//if ($user->socid > 0) accessforbidden();
//if ($user->socid > 0) $socid = $user->socid;
//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
//restrictedArea($user, $object->module, $object->id, $object->table_element, $object->element, 'fk_soc', 'rowid', $isdraft);
$isdraft = $object->status == Evaluation::STATUS_DRAFT ? 1 : 0;
restrictedArea($user, $object->element, $object, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
if (!isModEnabled('hrm')) {
accessforbidden();
}

View File

@@ -71,10 +71,8 @@ $permission = $user->hasRight('hrm', 'evaluation', 'write');
// Security check (enable the most restrictive one)
//if ($user->socid > 0) accessforbidden();
//if ($user->socid > 0) $socid = $user->socid;
//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
//restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
//if (empty($conf->hrm->enabled)) accessforbidden();
//if (!$permissiontoread) accessforbidden();
$isdraft = $object->status == Evaluation::STATUS_DRAFT ? 1 : 0;
restrictedArea($user, $object->element, $object, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);

View File

@@ -94,16 +94,12 @@ $permissiontoadd = $user->hasRight('hrm', 'evaluation', 'write'); // Used by th
$permissiontoread = $user->hasRight('hrm', 'evaluation', 'read');
// Security check (enable the most restrictive one)
//if ($user->socid > 0) accessforbidden();
//if ($user->socid > 0) $socid = $user->socid;
//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
//restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
if (empty($conf->hrm->enabled)) {
accessforbidden();
}
if (!$permissiontoread) {
accessforbidden();
}
$isdraft = $object->status == Evaluation::STATUS_DRAFT ? 1 : 0;
restrictedArea($user, $object->element, $object, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
if (!isModEnabled('hrm')) accessforbidden();
if (!$permissiontoread) accessforbidden();
/*

View File

@@ -75,10 +75,10 @@ $permissiontoread = $user->hasRight('hrm', 'evaluation', 'read'); // Used by th
// Security check (enable the most restrictive one)
//if ($user->socid > 0) accessforbidden();
//if ($user->socid > 0) $socid = $user->socid;
//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
//restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
//if (empty($conf->hrm->enabled)) accessforbidden();
//if (!$permissiontoread) accessforbidden();
$isdraft = (($object->status == Evaluation::STATUS_DRAFT) ? 1 : 0);
restrictedArea($user, $object->element, $object, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
if (empty($conf->hrm->enabled)) accessforbidden();
if (!$permissiontoread) accessforbidden();
/*

View File

@@ -1898,7 +1898,7 @@ if ($step == 5 && $datatoimport) {
//dol_syslog("line ".$sourcelinenb.' - '.$nboflines.' - '.$excludefirstline.' - '.$endatlinenb);
$arrayrecord = $obj->import_read_record();
if ($arrayrecord === false) {
$arrayofwarnings[$sourcelinenb][0] = array('lib' => 'File has '.$nboflines.' lines. However we reach the end of file or an empty line at record '.$sourcelinenb.'. This may occurs when some records are split onto several lines and not correctly delimited by the "Char delimiter", or if there is line with no data on all fields.', 'type' => 'EOF_RECORD_ON_SEVERAL_LINES');
$arrayofwarnings[$sourcelinenb][0] = array('lib' => $langs->trans('ErrorFileLinesReachEOF', $nboflines, $sourcelinenb), 'type' => 'EOF_RECORD_ON_SEVERAL_LINES');
$endoffile++;
continue;
}
@@ -2321,7 +2321,7 @@ if ($step == 6 && $datatoimport) {
$sourcelinenb++;
$arrayrecord = $obj->import_read_record();
if ($arrayrecord === false) {
$arrayofwarnings[$sourcelinenb][0] = array('lib' => 'File has '.$nboflines.' lines. However we reach the end of file or an empty line at record '.$sourcelinenb.'. This may occurs when some records are split onto several lines and not correctly delimited by the "Char delimiter", or if there is line with no data on all fields.', 'type' => 'EOF_RECORD_ON_SEVERAL_LINES');
$arrayofwarnings[$sourcelinenb][0] = array('lib' => $langs->trans('ErrorFileLinesReachEOF', $nboflines, $sourcelinenb), 'type' => 'EOF_RECORD_ON_SEVERAL_LINES');
$endoffile++;
continue;
}

View File

@@ -152,3 +152,4 @@ MandatoryTargetFieldsNotMapped=Some mandatory target fields are not mapped
AllTargetMandatoryFieldsAreMapped=All target fields that need a mandatory value are mapped
ResultOfSimulationNoError=Result of simulation: No error
NumberOfLinesLimited=Number of lines limited
ErrorFileLinesReachEOF=File has %s lines. However we reach the end of file or an empty line at record %s. This may occurs when some records are split onto several lines and not correctly delimited by the "Char delimiter", or if there is line with no data on all fields.

View File

@@ -337,7 +337,7 @@ if ((!defined('NOCSRFCHECK') && empty($dolibarr_nocsrfcheck) && getDolGlobalInt(
if ((GETPOSTISSET('massaction') || $tmpaction) && getDolGlobalInt('MAIN_SECURITY_CSRF_WITH_TOKEN') >= 3) {
// All GET actions (except the listed exceptions that are usually post for pre-actions and not real action) and mass actions are processed as sensitive.
// We exclude some action that are not sensitive so legitimate
if (GETPOSTISSET('massaction') || (strpos($tmpaction, 'display') !== 0 && !in_array($tmpaction, array('create', 'create2', 'createsite', 'createcard', 'edit', 'editcontract', 'editvalidator', 'file_manager', 'presend', 'presend_addmessage', 'preview', 'reconcile', 'specimen')))) {
if (GETPOSTISSET('massaction') || (strpos($tmpaction, 'display') !== 0 && !in_array($tmpaction, array('create', 'create2', 'createsite', 'createcard', 'edit', 'editcontract', 'editvalidator', 'file_manager', 'presend', 'presend_addmessage', 'preview', 'reconcile', 'specimen', 'validatenewpassword')))) {
$sensitiveget = true;
}
} elseif (getDolGlobalInt('MAIN_SECURITY_CSRF_WITH_TOKEN') >= 2) {

View File

@@ -55,9 +55,9 @@ $include_sub_warehouse = !empty(GETPOST('include_sub_warehouse')) ? GETPOST('inc
$hookmanager->initHooks(array('inventorycard', 'globalcard')); // Note that conf->hooks_modules contains array
if (!getDolGlobalString('MAIN_USE_ADVANCED_PERMS')) {
$result = restrictedArea($user, 'stock', $id);
$result = restrictedArea($user, 'stock', $id, 'inventory&stock');
} else {
$result = restrictedArea($user, 'stock', $id, '', 'inventory_advance');
$result = restrictedArea($user, 'stock', $id, 'inventory&stock', 'inventory_advance');
}
// Initialize a technical objects

View File

@@ -72,9 +72,9 @@ $totalExpectedValuation = 0;
$totalRealValuation = 0;
$hookmanager->initHooks(array('inventorycard')); // Note that conf->hooks_modules contains array
if (!getDolGlobalString('MAIN_USE_ADVANCED_PERMS')) {
$result = restrictedArea($user, 'stock', $id);
$result = restrictedArea($user, 'stock', $id, 'inventory&stock');
} else {
$result = restrictedArea($user, 'stock', $id, '', 'inventory_advance');
$result = restrictedArea($user, 'stock', $id, 'inventory&stock', 'inventory_advance');
}
// Initialize a technical objects

View File

@@ -85,8 +85,7 @@ if (!$sortorder) {
$hookmanager->initHooks(array('warehousecard', 'stocklist', 'globalcard'));
// Security check
//$result=restrictedArea($user,'stock', $id, 'entrepot&stock');
$result = restrictedArea($user, 'stock');
$result=restrictedArea($user, 'stock', $id, 'entrepot&stock');
$object = new Entrepot($db);
$extrafields = new ExtraFields($db);

View File

@@ -314,7 +314,7 @@ if ($action == 'addtime' && $user->hasRight('projet', 'lire') && GETPOST('formfi
}
}
if (!$updateoftaskdone && GETPOSTISSET($taskid.'progress')) { // Check to update progress if no update were done on task.
if (!$updateoftaskdone && GETPOSTISSET($tmptaskid.'progress')) { // Check to update progress if no update were done on task.
$object->fetch($tmptaskid);
//var_dump($object->progress);
//var_dump(GETPOST($tmptaskid . 'progress', 'int')); exit;

View File

@@ -22,7 +22,7 @@ use Luracast\Restler\RestException;
require_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/timespent.class.php';
/**
* API class for projects
@@ -528,6 +528,44 @@ class Tasks extends DolibarrApi
);
}
/**
* Get time spent of a task
*
* @param int $id Id of task
* @param int $timespent_id Id of timespent
*
* @url GET {id}/getTimeSpent/{timespent_id}
*
* @return Object data without useless information
*
* @throws RestException
*/
public function getTimeSpent($id, $timespent_id)
{
dol_syslog("API Rest request::getTimeSpent", LOG_DEBUG);
if (! DolibarrApiAccess::$user->hasRight('projet', 'lire')) {
throw new RestException(403);
}
$taskresult = $this->task->fetch($id);
if (!$taskresult ) {
throw new RestException(404, 'Task with id='.$id.' not found');
}
if (!DolibarrApi::_checkAccessToResource('task', $this->task->id)) {
throw new RestException(403, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
}
$timespent = new TimeSpent($this->db);
$timeresult = $timespent->fetch($timespent_id);
if (!$timeresult ) {
throw new RestException(404, 'Timespent with id='.$timespent_id.' not found');
}
if (!DolibarrApi::_checkAccessToResource('time', $timespent->id)) {
throw new RestException(403, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
}
return $this->_cleanTimeSpentObjectDatas($timespent);
}
/**
* Add time spent to a task of a project.
@@ -538,6 +576,7 @@ class Tasks extends DolibarrApi
* @param datetime $date Date (YYYY-MM-DD HH:MI:SS in GMT)
* @phan-param string $date
* @param int $duration Duration in seconds (3600 = 1h)
* @param int $product_id The product id that is used, default is null
* @param int $user_id User (Use 0 for connected user)
* @param string $note Note
*
@@ -548,7 +587,7 @@ class Tasks extends DolibarrApi
* @phan-return array{success:array{code:int,message:string}}
* @phpstan-return array{success:array{code:int,message:string}}
*/
public function addTimeSpent($id, $date, $duration, $user_id = 0, $note = '')
public function addTimeSpent($id, $date, $duration, $product_id = null, $user_id = 0, $note = '')
{
if (!DolibarrApiAccess::$user->hasRight('projet', 'creer')) {
throw new RestException(403);
@@ -572,6 +611,7 @@ class Tasks extends DolibarrApi
$this->task->timespent_datehour = $newdate;
$this->task->timespent_withhour = 1;
$this->task->timespent_duration = $duration;
$this->task->timespent_fk_product = $product_id;
$this->task->timespent_fk_user = $uid;
$this->task->timespent_note = $note;
@@ -601,6 +641,7 @@ class Tasks extends DolibarrApi
* @param datetime $date Date (YYYY-MM-DD HH:MI:SS in GMT)
* @phan-param string $date
* @param int $duration Duration in seconds (3600 = 1h)
* @param int $product_id The product id that is used, default is null
* @param int $user_id User (Use 0 for connected user)
* @param string $note Note
*
@@ -610,7 +651,7 @@ class Tasks extends DolibarrApi
* @phan-return array{success:array{code:int,message:string}}
* @phpstan-return array{success:array{code:int,message:string}}
*/
public function putTimeSpent($id, $timespent_id, $date, $duration, $user_id = 0, $note = '')
public function putTimeSpent($id, $timespent_id, $date, $duration, $product_id = null, $user_id = 0, $note = '')
{
if (!DolibarrApiAccess::$user->hasRight('projet', 'creer')) {
throw new RestException(403);
@@ -626,6 +667,7 @@ class Tasks extends DolibarrApi
$this->task->timespent_datehour = $newdate;
$this->task->timespent_withhour = 1;
$this->task->timespent_duration = $duration;
$this->task->timespent_fk_product = $product_id;
$this->task->timespent_fk_user = $user_id ?? DolibarrApiAccess::$user->id;
$this->task->timespent_note = $note;
@@ -689,8 +731,9 @@ class Tasks extends DolibarrApi
*
* @return void
*/
protected function timespentRecordChecks($id, $timespent_id)
private function timespentRecordChecks($id, $timespent_id)
{
dol_syslog("API Rest request::timespentRecordChecks", LOG_DEBUG);
if ($this->task->fetch($id) <= 0) {
throw new RestException(404, 'Task not found');
}
@@ -755,6 +798,132 @@ class Tasks extends DolibarrApi
return $object;
}
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
/**
* Clean sensitive object data
* @phpstan-template T of Object
*
* @param Object $object Object to clean
* @return Object Object with cleaned properties
*
* @phpstan-param T $object
* @phpstan-return T
*/
protected function _cleanTimeSpentObjectDatas($object)
{
if (!$object->note_private) {
$object->note_private = $object->note;
// unsure if we should use note_private or note_public, but note_private should be more secure
}
$saving_fk_element = $object->fk_element;
// because calling parent::_cleanObjectDatas clears fk_element
// phpcs:enable
$object = parent::_cleanObjectDatas($object);
unset($object->barcode_type);
unset($object->barcode_type_code);
unset($object->barcode_type_label);
unset($object->barcode_type_coder);
unset($object->cond_reglement_id);
unset($object->cond_reglement);
unset($object->fk_delivery_address);
unset($object->shipping_method_id);
unset($object->fk_account);
unset($object->fk_incoterms);
unset($object->label_incoterms);
unset($object->location_incoterms);
unset($object->name);
unset($object->lastname);
unset($object->firstname);
unset($object->civility_id);
unset($object->mode_reglement_id);
unset($object->country);
unset($object->country_id);
unset($object->country_code);
unset($object->weekWorkLoad);
unset($object->weekWorkLoad);
unset($object->actiontypecode);
unset($object->array_languages);
unset($object->array_options);
unset($object->canvas);
unset($object->civility_code);
unset($object->cond_reglement_supplier_id);
unset($object->contact_id);
unset($object->contacts_ids);
unset($object->contacts_ids_internal);
unset($object->date_cloture);
unset($object->date_validation);
unset($object->demand_reason_id);
unset($object->deposit_percent);
unset($object->entity);
unset($object->extraparams);
unset($object->fk_multicurrency);
unset($object->fk_project);
unset($object->fk_user_creat);
unset($object->fk_user_modif);
unset($object->last_main_doc);
unset($object->lines);
unset($object->linkedObjectsIds);
unset($object->module);
unset($object->multicurrency_code);
unset($object->multicurrency_total_ht);
unset($object->multicurrency_total_localtax1);
unset($object->multicurrency_total_localtax2);
unset($object->multicurrency_total_ttc);
unset($object->multicurrency_total_tva);
unset($object->multicurrency_tx);
unset($object->note_public);
unset($object->origin_id);
unset($object->origin_type);
unset($object->product);
unset($object->ref);
unset($object->region_id);
unset($object->retained_warranty_fk_cond_reglement);
unset($object->rowid);
unset($object->shipping_method);
unset($object->specimen);
unset($object->state_id);
unset($object->status);
unset($object->statut);
unset($object->totalpaid);
unset($object->transport_mode_id);
unset($object->user);
unset($object->user_author);
unset($object->user_closing_id);
unset($object->user_creation);
unset($object->user_creation_id);
unset($object->user_modification);
unset($object->user_modification_id);
unset($object->user_valid);
unset($object->user_validation);
unset($object->user_validation_id);
unset($object->warehouse_id);
unset($object->total_ht);
unset($object->total_tva);
unset($object->total_localtax1);
unset($object->total_localtax2);
unset($object->total_ttc);
unset($object->comments);
if (!$object->date_creation) {
$object->date_creation = $object->datec;
}
if (!$object->date_modification) {
$object->date_modification = $object->tms;
}
if (!$object->fk_element) {
$object->fk_element = $saving_fk_element;
// because calling parent::_cleanObjectDatas clears fk_element
}
return $object;
}
/**
* Validate fields before create or update object
*
@@ -776,8 +945,4 @@ class Tasks extends DolibarrApi
}
return $object;
}
// \todo
// getSummaryOfTimeSpent
}

View File

@@ -1753,6 +1753,7 @@ class Task extends CommonObjectLine
$sql .= " ptt.element_date_withhour as task_date_withhour,";
$sql .= " ptt.element_duration as task_duration,";
$sql .= " ptt.fk_user,";
$sql .= " ptt.fk_product,";
$sql .= " ptt.note,";
$sql .= " ptt.thm,";
$sql .= " pt.rowid as task_id,";
@@ -1803,6 +1804,7 @@ class Task extends CommonObjectLine
$newobj->timespent_line_withhour = $obj->task_date_withhour;
$newobj->timespent_line_duration = $obj->task_duration;
$newobj->timespent_line_fk_user = $obj->fk_user;
$newobj->timespent_line_fk_product = $obj->fk_product;
$newobj->timespent_line_thm = $obj->thm; // hourly rate
$newobj->timespent_line_note = $obj->note;

View File

@@ -140,8 +140,8 @@ if (g.getDivId() != null)
'task_alternate_id' => (int) -$t['task_project_id'],
'task_name' => $projecttmp->ref.' '.$projecttmp->title,
'task_resources' => '',
'task_start_date' => 0,
'task_end_date' => 0,
'task_start_date' => $projecttmp->date_start,
'task_end_date' => (!empty($projecttmp->date_end) ? $projecttmp->date_end : 0),
'task_is_group' => 1, 'task_position' => 0, 'task_css' => 'ggroupblack', 'task_milestone' => 0, 'task_parent' => 0, 'task_parent_alternate_id' => 0,
'note' => '',
'task_planned_workload' => 0

View File

@@ -204,7 +204,7 @@ if (($id > 0 && is_numeric($id)) || !empty($ref)) {
print '</td></tr>';
// Date start - end project
print '<tr><td>'.$langs->trans("Dates").'</td><td>';
print '<tr><td>'.$langs->trans("DateStart").' - '.$langs->trans("DateEnd").'</td><td>';
$start = dol_print_date($object->date_start, 'day');
print($start ? $start : '?');
$end = dol_print_date($object->date_end, 'day');