Passed
Branch develop (049034)
by
unknown
31:10
created

Thirdparties::deleteCategory()   A

Complexity

Conditions 6
Paths 6

Size

Total Lines 26
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 15
c 0
b 0
f 0
nc 6
nop 2
dl 0
loc 26
rs 9.2222
1
<?php
2
/* Copyright (C) 2015   Jean-François Ferry     <[email protected]>
3
 * Copyright (C) 2018   Pierre Chéné            <[email protected]>
4
 * Copyright (C) 2019   Cedric Ancelin          <[email protected]>
5
 *
6
 * This program is free software; you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License as published by
8
 * the Free Software Foundation; either version 3 of the License, or
9
 * (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18
 */
19
20
use Luracast\Restler\RestException;
21
22
23
/**
24
 * API class for thirdparties
25
 *
26
 * @access protected
27
 * @class  DolibarrApiAccess {@requires user,external}
28
 *
29
 */
30
class Thirdparties extends DolibarrApi
31
{
32
	/**
33
	 *
34
	 * @var array   $FIELDS     Mandatory fields, checked when create and update object
35
	 */
36
	static $FIELDS = array(
37
		'name'
38
	);
39
40
	/**
41
	 * @var Societe $company {@type Societe}
42
	 */
43
	public $company;
44
45
	/**
46
	 * Constructor
47
	 */
48
    public function __construct()
49
	{
50
		global $db, $conf;
51
		$this->db = $db;
52
53
		require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
54
		require_once DOL_DOCUMENT_ROOT.'/societe/class/societeaccount.class.php';
55
		require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
56
		require_once DOL_DOCUMENT_ROOT.'/societe/class/companybankaccount.class.php';
57
58
		$this->company = new Societe($this->db);
59
60
		if (!empty($conf->global->SOCIETE_EMAIL_MANDATORY)) {
61
			static::$FIELDS[] = 'email';
62
		}
63
	}
64
65
	/**
66
	 * Get properties of a thirdparty object
67
	 *
68
	 * Return an array with thirdparty informations
69
	 *
70
	 * @param 	int 	$id ID of thirdparty
71
	 * @return 	array|mixed data without useless information
72
	 *
73
	 * @throws 	RestException
74
	 */
75
    public function get($id)
76
	{
77
        return $this->_fetch($id);
78
    }
79
80
	/**
81
	 * Get properties of a thirdparty object by email.
82
	 *
83
	 * Return an array with thirdparty informations
84
	 *
85
	 * @param string    $email  Sort field
86
	 * @return array|mixed data without useless information
87
	 *
88
	 * @url     GET byEmail/{email}
89
	 *
90
	 * @throws RestException
91
	 */
92
	public function getByEmail($email)
93
	{
94
	    return $this->_fetch('', '', '', '', '', '', '', '', '', '', $email);
95
	}
96
97
	/**
98
	 * List thirdparties
99
	 *
100
	 * Get a list of thirdparties
101
	 *
102
	 * @param   string  $sortfield  Sort field
103
	 * @param   string  $sortorder  Sort order
104
	 * @param   int     $limit      Limit for list
105
	 * @param   int     $page       Page number
106
	 * @param   int     $mode       Set to 1 to show only customers
107
	 *                              Set to 2 to show only prospects
108
	 *                              Set to 3 to show only those are not customer neither prospect
109
	 *								Set to 4 to show only suppliers
110
	 * @param  int    $category   Use this param to filter list by category
111
	 * @param   string  $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.nom:like:'TheCompany%') and (t.date_creation:<:'20160101')"
112
	 * @return  array               Array of thirdparty objects
113
	 */
114
    public function index($sortfield = "t.rowid", $sortorder = 'ASC', $limit = 100, $page = 0, $mode = 0, $category = 0, $sqlfilters = '')
115
    {
116
		global $db;
117
118
		$obj_ret = array();
119
120
		// case of external user, we force socids
121
		$socids = DolibarrApiAccess::$user->socid ? DolibarrApiAccess::$user->socid : '';
122
123
		// If the internal user must only see his customers, force searching by him
124
		$search_sale = 0;
125
		if (!DolibarrApiAccess::$user->rights->societe->client->voir && !$socids) $search_sale = DolibarrApiAccess::$user->id;
126
127
		$sql = "SELECT t.rowid";
128
		if ((!DolibarrApiAccess::$user->rights->societe->client->voir && !$socids) || $search_sale > 0) $sql .= ", sc.fk_soc, sc.fk_user"; // We need these fields in order to filter by sale (including the case where the user can only see his prospects)
129
		$sql .= " FROM ".MAIN_DB_PREFIX."societe as t";
130
    	if ($category > 0) {
131
			if ($mode != 4) $sql .= ", ".MAIN_DB_PREFIX."categorie_societe as c";
132
			if (!in_array($mode, array(1, 2, 3))) $sql .= ", ".MAIN_DB_PREFIX."categorie_fournisseur as cc";
133
    	}
134
		if ((!DolibarrApiAccess::$user->rights->societe->client->voir && !$socids) || $search_sale > 0) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; // We need this table joined to the select in order to filter by sale
135
		$sql .= ", ".MAIN_DB_PREFIX."c_stcomm as st";
136
		$sql .= " WHERE t.entity IN (".getEntity('societe').")";
137
		$sql .= " AND t.fk_stcomm = st.id";
138
139
		if ($mode == 1) $sql .= " AND t.client IN (1, 3)";
140
		if ($mode == 2) $sql .= " AND t.client IN (2, 3)";
141
		if ($mode == 3) $sql .= " AND t.client IN (0)";
142
		if ($mode == 4) $sql .= " AND t.fournisseur IN (1)";
143
144
    	// Select thirdparties of given category
145
    	if ($category > 0) {
146
			if (!empty($mode) && $mode != 4) { $sql .= " AND c.fk_categorie = ".$db->escape($category)." AND c.fk_soc = t.rowid"; } elseif (!empty($mode) && $mode == 4) { $sql .= " AND cc.fk_categorie = ".$db->escape($category)." AND cc.fk_soc = t.rowid"; } else { $sql .= " AND ((c.fk_categorie = ".$db->escape($category)." AND c.fk_soc = t.rowid) OR (cc.fk_categorie = ".$db->escape($category)." AND cc.fk_soc = t.rowid))"; }
147
    	}
148
149
		if ((!DolibarrApiAccess::$user->rights->societe->client->voir && !$socids) || $search_sale > 0) $sql .= " AND t.rowid = sc.fk_soc";
150
		//if ($email != NULL) $sql.= " AND s.email = \"".$email."\"";
151
		if ($socids) $sql .= " AND t.rowid IN (".$socids.")";
152
		if ($search_sale > 0) $sql .= " AND t.rowid = sc.fk_soc"; // Join for the needed table to filter by sale
153
		// Insert sale filter
154
		if ($search_sale > 0)
155
		{
156
			$sql .= " AND sc.fk_user = ".$search_sale;
157
		}
158
		// Add sql filters
159
		if ($sqlfilters)
160
		{
161
			if (!DolibarrApi::_checkFilters($sqlfilters))
162
			{
163
				throw new RestException(503, 'Error when validating parameter sqlfilters '.$sqlfilters);
164
			}
165
			$regexstring = '\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)';
166
			$sql .= " AND (".preg_replace_callback('/'.$regexstring.'/', 'DolibarrApi::_forge_criteria_callback', $sqlfilters).")";
167
		}
168
169
		$sql .= $db->order($sortfield, $sortorder);
170
171
		if ($limit) {
172
			if ($page < 0)
173
			{
174
				$page = 0;
175
			}
176
			$offset = $limit * $page;
177
178
			$sql .= $db->plimit($limit + 1, $offset);
179
		}
180
181
		$result = $db->query($sql);
182
		if ($result)
183
		{
184
			$num = $db->num_rows($result);
185
			$min = min($num, ($limit <= 0 ? $num : $limit));
186
            $i = 0;
187
			while ($i < $min)
188
			{
189
				$obj = $db->fetch_object($result);
190
				$soc_static = new Societe($db);
191
				if ($soc_static->fetch($obj->rowid)) {
192
					$obj_ret[] = $this->_cleanObjectDatas($soc_static);
193
				}
194
				$i++;
195
			}
196
		} else {
197
			throw new RestException(503, 'Error when retrieve thirdparties : '.$db->lasterror());
198
		}
199
		if (!count($obj_ret)) {
200
			throw new RestException(404, 'Thirdparties not found');
201
		}
202
		return $obj_ret;
203
	}
204
205
	/**
206
	 * Create thirdparty object
207
	 *
208
	 * @param array $request_data   Request datas
209
	 * @return int  ID of thirdparty
210
	 */
211
    public function post($request_data = null)
212
	{
213
		if (!DolibarrApiAccess::$user->rights->societe->creer) {
214
			throw new RestException(401);
215
		}
216
		// Check mandatory fields
217
		$result = $this->_validate($request_data);
218
219
		foreach ($request_data as $field => $value) {
220
			$this->company->$field = $value;
221
		}
222
		if ($this->company->create(DolibarrApiAccess::$user) < 0)
223
			throw new RestException(500, 'Error creating thirdparty', array_merge(array($this->company->error), $this->company->errors));
224
225
		return $this->company->id;
226
	}
227
228
	/**
229
	 * Update thirdparty
230
	 *
231
	 * @param int   $id             Id of thirdparty to update
232
	 * @param array $request_data   Datas
233
	 * @return int
234
	 */
235
    public function put($id, $request_data = null)
236
	{
237
		if (!DolibarrApiAccess::$user->rights->societe->creer) {
238
			throw new RestException(401);
239
		}
240
241
		$result = $this->company->fetch($id);
242
		if (!$result) {
243
			throw new RestException(404, 'Thirdparty not found');
244
		}
245
246
		if (!DolibarrApi::_checkAccessToResource('societe', $this->company->id)) {
247
			throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
248
		}
249
250
		foreach ($request_data as $field => $value) {
251
			if ($field == 'id') continue;
252
			$this->company->$field = $value;
253
		}
254
255
		if ($this->company->update($id, DolibarrApiAccess::$user, 1, '', '', 'update'))
256
			return $this->get($id);
257
258
		return false;
259
	}
260
261
	/**
262
	 * Merge a thirdparty into another one.
263
	 *
264
	 * Merge content (properties, notes) and objects (like invoices, events, orders, proposals, ...) of a thirdparty into a target thirdparty,
265
	 * then delete the merged thirdparty.
266
	 * If a property has a defined value both in thirdparty to delete and thirdparty to keep, the value into the thirdparty to
267
	 * delete will be ignored, the value of target thirdparty will remain, except for notes (content is concatenated).
268
	 *
269
	 * @param int   $id             ID of thirdparty to keep (the target thirdparty)
270
	 * @param int   $idtodelete     ID of thirdparty to remove (the thirdparty to delete), once data has been merged into the target thirdparty.
271
	 * @return int
272
	 *
273
	 * @url PUT {id}/merge/{idtodelete}
274
	 */
275
    public function merge($id, $idtodelete)
276
	{
277
		global $db, $hookmanager;
278
279
		$error = 0;
280
281
		if ($id == $idtodelete)
282
		{
283
			throw new RestException(400, 'Try to merge a thirdparty into itself');
284
		}
285
286
		if (!DolibarrApiAccess::$user->rights->societe->creer) {
287
			throw new RestException(401);
288
		}
289
290
		$result = $this->company->fetch($id); // include the fetch of extra fields
291
		if (!$result) {
292
			throw new RestException(404, 'Thirdparty not found');
293
		}
294
295
		if (!DolibarrApi::_checkAccessToResource('societe', $this->company->id)) {
296
			throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
297
		}
298
299
		$this->companytoremove = new Societe($db);
300
301
		$result = $this->companytoremove->fetch($idtodelete); // include the fetch of extra fields
302
		if (!$result) {
303
			throw new RestException(404, 'Thirdparty not found');
304
		}
305
306
		if (!DolibarrApi::_checkAccessToResource('societe', $this->companytoremove->id)) {
307
			throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
308
		}
309
310
		$soc_origin = $this->companytoremove;
311
		$object = $this->company;
312
		$user = DolibarrApiAccess::$user;
313
314
315
		// Call same code than into action 'confirm_merge'
316
317
318
		$db->begin();
319
320
		// Recopy some data
321
		$object->client = $object->client | $soc_origin->client;
322
		$object->fournisseur = $object->fournisseur | $soc_origin->fournisseur;
323
		$listofproperties = array(
324
			'address', 'zip', 'town', 'state_id', 'country_id', 'phone', 'phone_pro', 'fax', 'email', 'skype', 'url', 'barcode',
325
			'idprof1', 'idprof2', 'idprof3', 'idprof4', 'idprof5', 'idprof6',
326
			'tva_intra', 'effectif_id', 'forme_juridique', 'remise_percent', 'remise_supplier_percent', 'mode_reglement_supplier_id', 'cond_reglement_supplier_id', 'name_bis',
327
			'stcomm_id', 'outstanding_limit', 'price_level', 'parent', 'default_lang', 'ref', 'ref_ext', 'import_key', 'fk_incoterms', 'fk_multicurrency',
328
			'code_client', 'code_fournisseur', 'code_compta', 'code_compta_fournisseur',
329
			'model_pdf', 'fk_projet'
330
		);
331
		foreach ($listofproperties as $property)
332
		{
333
			if (empty($object->$property)) $object->$property = $soc_origin->$property;
334
		}
335
336
		// Concat some data
337
		$listofproperties = array(
338
			'note_public', 'note_private'
339
		);
340
		foreach ($listofproperties as $property)
341
		{
342
			$object->$property = dol_concatdesc($object->$property, $soc_origin->$property);
343
		}
344
345
		// Merge extrafields
346
		if (is_array($soc_origin->array_options))
347
		{
348
			foreach ($soc_origin->array_options as $key => $val)
349
			{
350
				if (empty($object->array_options[$key])) $object->array_options[$key] = $val;
351
			}
352
		}
353
354
		// Merge categories
355
		$static_cat = new Categorie($db);
356
		$custcats = $static_cat->containing($soc_origin->id, 'customer', 'id');
357
		$object->setCategories($custcats, 'customer');
358
		$suppcats = $static_cat->containing($soc_origin->id, 'supplier', 'id');
359
		$object->setCategories($suppcats, 'supplier');
360
361
		// If thirdparty has a new code that is same than origin, we clean origin code to avoid duplicate key from database unique keys.
362
		if ($soc_origin->code_client == $object->code_client
363
			|| $soc_origin->code_fournisseur == $object->code_fournisseur
364
			|| $soc_origin->barcode == $object->barcode)
365
		{
366
			dol_syslog("We clean customer and supplier code so we will be able to make the update of target");
367
			$soc_origin->code_client = '';
368
			$soc_origin->code_fournisseur = '';
369
			$soc_origin->barcode = '';
370
			$soc_origin->update($soc_origin->id, $user, 0, 1, 1, 'merge');
371
		}
372
373
		// Update
374
		$result = $object->update($object->id, $user, 0, 1, 1, 'merge');
375
		if ($result < 0)
376
		{
377
			$error++;
378
		}
379
380
		// Move links
381
		if (!$error)
382
		{
383
			$objects = array(
384
				'Adherent' => '/adherents/class/adherent.class.php',
385
				'Societe' => '/societe/class/societe.class.php',
386
				'Categorie' => '/categories/class/categorie.class.php',
387
				'ActionComm' => '/comm/action/class/actioncomm.class.php',
388
				'Propal' => '/comm/propal/class/propal.class.php',
389
				'Commande' => '/commande/class/commande.class.php',
390
				'Facture' => '/compta/facture/class/facture.class.php',
391
				'FactureRec' => '/compta/facture/class/facture-rec.class.php',
392
				'LignePrelevement' => '/compta/prelevement/class/ligneprelevement.class.php',
393
				'Contact' => '/contact/class/contact.class.php',
394
				'Contrat' => '/contrat/class/contrat.class.php',
395
				'Expedition' => '/expedition/class/expedition.class.php',
396
				'Fichinter' => '/fichinter/class/fichinter.class.php',
397
				'CommandeFournisseur' => '/fourn/class/fournisseur.commande.class.php',
398
				'FactureFournisseur' => '/fourn/class/fournisseur.facture.class.php',
399
				'SupplierProposal' => '/supplier_proposal/class/supplier_proposal.class.php',
400
				'ProductFournisseur' => '/fourn/class/fournisseur.product.class.php',
401
				'Livraison' => '/livraison/class/livraison.class.php',
402
				'Product' => '/product/class/product.class.php',
403
				'Project' => '/projet/class/project.class.php',
404
				'User' => '/user/class/user.class.php',
405
			);
406
407
			//First, all core objects must update their tables
408
			foreach ($objects as $object_name => $object_file)
409
			{
410
				require_once DOL_DOCUMENT_ROOT.$object_file;
411
412
				if (!$errors && !$object_name::replaceThirdparty($db, $soc_origin->id, $object->id))
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $errors does not exist. Did you maybe mean $error?
Loading history...
413
				{
414
					$errors++;
415
					//setEventMessages($db->lasterror(), null, 'errors');
416
				}
417
			}
418
		}
419
420
		// External modules should update their ones too
421
		if (!$errors)
422
		{
423
            $reshook = $hookmanager->executeHooks('replaceThirdparty', array(
424
				'soc_origin' => $soc_origin->id,
425
				'soc_dest' => $object->id
426
			), $soc_dest, $action);
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $soc_dest seems to be never defined.
Loading history...
Comprehensibility Best Practice introduced by
The variable $action seems to be never defined.
Loading history...
427
428
			if ($reshook < 0)
429
			{
430
				//setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
431
				$errors++;
432
			}
433
		}
434
435
436
		if (!$error)
437
		{
438
			$object->context = array('merge'=>1, 'mergefromid'=>$soc_origin->id);
439
440
			// Call trigger
441
			$result = $object->call_trigger('COMPANY_MODIFY', $user);
442
			if ($result < 0)
443
			{
444
				//setEventMessages($object->error, $object->errors, 'errors');
445
				$error++;
446
			}
447
			// End call triggers
448
		}
449
450
		if (!$error)
451
		{
452
			//We finally remove the old thirdparty
453
			if ($soc_origin->delete($soc_origin->id, $user) < 1)
454
			{
455
				$errors++;
456
			}
457
		}
458
459
		// End of merge
460
461
		if ($error)
462
		{
463
			$db->rollback();
464
465
			throw new RestException(500, 'Error failed to merged thirdparty '.$this->companytoremove->id.' into '.$id.'. Enable and read log file for more information.');
466
		} else {
467
			$db->commit();
468
		}
469
470
		return $this->get($id);
471
	}
472
473
	/**
474
	 * Delete thirdparty
475
	 *
476
	 * @param int $id   Thirparty ID
477
	 * @return integer
478
	 */
479
    public function delete($id)
480
	{
481
		if (!DolibarrApiAccess::$user->rights->societe->supprimer) {
482
			throw new RestException(401);
483
		}
484
		$result = $this->company->fetch($id);
485
		if (!$result) {
486
			throw new RestException(404, 'Thirdparty not found');
487
		}
488
		if (!DolibarrApi::_checkAccessToResource('societe', $this->company->id)) {
489
			throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
490
		}
491
        $this->company->oldcopy = clone $this->company;
492
		return $this->company->delete($id);
493
    }
494
495
	/**
496
	 * Set new price level for the given thirdparty
497
	 *
498
	 * @param	int		$id				ID of thirdparty
499
	 * @param	int		$priceLevel		Price level to apply to thirdparty
500
	 * @return	object					Thirdparty data without useless information
501
	 *
502
	 * @url PUT {id}/setpricelevel
503
	 *
504
	 * @throws RestException 400 Price level out of bounds
505
	 * @throws RestException 401 Access not allowed for your login
506
	 * @throws RestException 404 Thirdparty not found
507
	 * @throws RestException 500 Error fetching/setting price level
508
	 * @throws RestException 501 Request needs modules "Thirdparties" and "Products" and setting Multiprices activated
509
	 */
510
	public function setThirdpartyPriceLevel($id, $priceLevel)
511
	{
512
		global $conf;
513
514
		if (empty($conf->societe->enabled)) {
515
			throw new RestException(501, 'Module "Thirdparties" needed for this request');
516
		}
517
518
		if (empty($conf->product->enabled)) {
519
			throw new RestException(501, 'Module "Products" needed for this request');
520
		}
521
522
		if (empty($conf->global->PRODUIT_MULTIPRICES)) {
523
			throw new RestException(501, 'Multiprices features activation needed for this request');
524
		}
525
526
		if ($priceLevel < 1 || $priceLevel > $conf->global->PRODUIT_MULTIPRICES_LIMIT) {
527
			throw new RestException(400, 'Price level must be between 1 and ' . $conf->global->PRODUIT_MULTIPRICES_LIMIT);
528
		}
529
530
		if (empty(DolibarrApiAccess::$user->rights->societe->creer)) {
531
			throw new RestException(401, 'Access to thirdparty ' . $id . ' not allowed for login '. DolibarrApiAccess::$user->login);
532
		}
533
534
		$result = $this->company->fetch($id);
535
		if ($result < 0) {
536
			throw new RestException(404, 'Thirdparty ' . $id . ' not found');
537
		}
538
539
		if (empty($result)) {
540
			throw new RestException(500, 'Error fetching thirdparty ' . $id, array_merge(array($this->company->error), $this->company->errors));
541
		}
542
543
		if (empty(DolibarrApi::_checkAccessToResource('societe', $this->company->id))) {
544
			throw new RestException(401, 'Access to thirdparty ' . $id . ' not allowed for login ' . DolibarrApiAccess::$user->login);
545
		}
546
547
		$result = $this->company->set_price_level($priceLevel, DolibarrApiAccess::$user);
548
		if ($result <= 0) {
549
			throw new RestException(500, 'Error setting new price level for thirdparty ' . $id, array($this->company->db->lasterror()));
550
		}
551
552
		return $this->_cleanObjectDatas($this->company);
553
	}
554
555
	/**
556
	 * Get customer categories for a thirdparty
557
	 *
558
	 * @param int		$id         ID of thirdparty
559
	 * @param string	$sortfield	Sort field
560
	 * @param string	$sortorder	Sort order
561
	 * @param int		$limit		Limit for list
562
	 * @param int		$page		Page number
563
	 *
564
	 * @return mixed
565
	 *
566
	 * @url GET {id}/categories
567
	 */
568
    public function getCategories($id, $sortfield = "s.rowid", $sortorder = 'ASC', $limit = 0, $page = 0)
569
	{
570
		if (!DolibarrApiAccess::$user->rights->categorie->lire) {
571
			throw new RestException(401);
572
		}
573
574
		$result = $this->company->fetch($id);
575
		if (!$result)
576
		{
577
			throw new RestException(404, 'Thirdparty not found');
578
		}
579
580
		$categories = new Categorie($this->db);
581
582
		$result = $categories->getListForItem($id, 'customer', $sortfield, $sortorder, $limit, $page);
583
584
		if (is_numeric($result) && $result < 0)
585
		{
586
			throw new RestException(503, 'Error when retrieve category list : '.$categories->error);
587
		}
588
589
		if (is_numeric($result) && $result == 0)	// To fix a return of 0 instead of empty array of method getListForItem
590
		{
591
			return array();
592
		}
593
594
		return $result;
595
	}
596
597
	/**
598
	 * Add a customer category to a thirdparty
599
	 *
600
	 * @param int		$id				Id of thirdparty
601
	 * @param int       $category_id	Id of category
602
	 *
603
	 * @return mixed
604
	 *
605
	 * @url POST {id}/categories/{category_id}
606
	 */
607
    public function addCategory($id, $category_id)
608
	{
609
		if (!DolibarrApiAccess::$user->rights->societe->creer) {
610
			throw new RestException(401);
611
		}
612
613
		$result = $this->company->fetch($id);
614
		if (!$result) {
615
			throw new RestException(404, 'Thirdparty not found');
616
		}
617
		$category = new Categorie($this->db);
618
		$result = $category->fetch($category_id);
619
		if (!$result) {
620
			throw new RestException(404, 'category not found');
621
		}
622
623
		if (!DolibarrApi::_checkAccessToResource('societe', $this->company->id)) {
624
			throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
625
		}
626
		if (!DolibarrApi::_checkAccessToResource('category', $category->id)) {
627
			throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
628
		}
629
630
		$category->add_type($this->company, 'customer');
631
632
		return $this->_cleanObjectDatas($this->company);
633
	}
634
635
	/**
636
	 * Remove the link between a customer category and the thirdparty
637
	 *
638
	 * @param int		$id				Id of thirdparty
639
	 * @param int		$category_id	Id of category
640
	 *
641
	 * @return mixed
642
	 *
643
	 * @url DELETE {id}/categories/{category_id}
644
	 */
645
    public function deleteCategory($id, $category_id)
646
	{
647
		if (!DolibarrApiAccess::$user->rights->societe->creer) {
648
			throw new RestException(401);
649
		}
650
651
		$result = $this->company->fetch($id);
652
		if (!$result) {
653
			throw new RestException(404, 'Thirdparty not found');
654
		}
655
		$category = new Categorie($this->db);
656
		$result = $category->fetch($category_id);
657
		if (!$result) {
658
			throw new RestException(404, 'category not found');
659
		}
660
661
		if (!DolibarrApi::_checkAccessToResource('societe', $this->company->id)) {
662
			throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
663
		}
664
		if (!DolibarrApi::_checkAccessToResource('category', $category->id)) {
665
			throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
666
		}
667
668
		$category->del_type($this->company, 'customer');
669
670
		return $this->_cleanObjectDatas($this->company);
671
	}
672
673
	/**
674
	 * Get supplier categories for a thirdparty
675
	 *
676
	 * @param int		$id         ID of thirdparty
677
	 * @param string	$sortfield	Sort field
678
	 * @param string	$sortorder	Sort order
679
	 * @param int		$limit		Limit for list
680
	 * @param int		$page		Page number
681
	 *
682
	 * @return mixed
683
	 *
684
	 * @url GET {id}/supplier_categories
685
	 */
686
    public function getSupplierCategories($id, $sortfield = "s.rowid", $sortorder = 'ASC', $limit = 0, $page = 0)
687
	{
688
		if (!DolibarrApiAccess::$user->rights->categorie->lire) {
689
			throw new RestException(401);
690
		}
691
692
		$result = $this->company->fetch($id);
693
		if (!$result)
694
		{
695
			throw new RestException(404, 'Thirdparty not found');
696
		}
697
698
		$categories = new Categorie($this->db);
699
700
		$result = $categories->getListForItem($id, 'supplier', $sortfield, $sortorder, $limit, $page);
701
702
		if (is_numeric($result) && $result < 0)
703
		{
704
			throw new RestException(503, 'Error when retrieve category list : '.$categories->error);
705
		}
706
707
		if (is_numeric($result) && $result == 0)	// To fix a return of 0 instead of empty array of method getListForItem
708
		{
709
			return array();
710
		}
711
712
		return $result;
713
	}
714
715
	/**
716
	 * Add a supplier category to a thirdparty
717
	 *
718
	 * @param int		$id				Id of thirdparty
719
	 * @param int       $category_id	Id of category
720
	 *
721
	 * @return mixed
722
	 *
723
	 * @url POST {id}/supplier_categories/{category_id}
724
	 */
725
    public function addSupplierCategory($id, $category_id)
726
	{
727
		if (!DolibarrApiAccess::$user->rights->societe->creer) {
728
			throw new RestException(401);
729
		}
730
731
		$result = $this->company->fetch($id);
732
		if (!$result) {
733
			throw new RestException(404, 'Thirdparty not found');
734
		}
735
		$category = new Categorie($this->db);
736
		$result = $category->fetch($category_id);
737
		if (!$result) {
738
			throw new RestException(404, 'category not found');
739
		}
740
741
		if (!DolibarrApi::_checkAccessToResource('societe', $this->company->id)) {
742
			throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
743
		}
744
		if (!DolibarrApi::_checkAccessToResource('category', $category->id)) {
745
			throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
746
		}
747
748
		$category->add_type($this->company, 'supplier');
749
750
		return $this->_cleanObjectDatas($this->company);
751
	}
752
753
	/**
754
	 * Remove the link between a category and the thirdparty
755
	 *
756
	 * @param int		$id				Id of thirdparty
757
	 * @param int		$category_id	Id of category
758
	 *
759
	 * @return mixed
760
	 *
761
	 * @url DELETE {id}/supplier_categories/{category_id}
762
	 */
763
    public function deleteSupplierCategory($id, $category_id)
764
	{
765
		if (!DolibarrApiAccess::$user->rights->societe->creer) {
766
			throw new RestException(401);
767
		}
768
769
		$result = $this->company->fetch($id);
770
		if (!$result) {
771
			throw new RestException(404, 'Thirdparty not found');
772
		}
773
		$category = new Categorie($this->db);
774
		$result = $category->fetch($category_id);
775
		if (!$result) {
776
			throw new RestException(404, 'category not found');
777
		}
778
779
		if (!DolibarrApi::_checkAccessToResource('societe', $this->company->id)) {
780
			throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
781
		}
782
		if (!DolibarrApi::_checkAccessToResource('category', $category->id)) {
783
			throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
784
		}
785
786
		$category->del_type($this->company, 'supplier');
787
788
		return $this->_cleanObjectDatas($this->company);
789
	}
790
791
792
	/**
793
	 * Get outstanding proposals of thirdparty
794
	 *
795
	 * @param 	int 	$id			ID of the thirdparty
796
	 * @param 	string 	$mode		'customer' or 'supplier'
797
	 *
798
	 * @url     GET {id}/outstandingproposals
799
	 *
800
	 * @return array  				List of outstandings proposals of thirdparty
801
	 *
802
	 * @throws RestException 400
803
	 * @throws RestException 401
804
	 * @throws RestException 404
805
	 */
806
    public function getOutStandingProposals($id, $mode = 'customer')
807
	{
808
		$obj_ret = array();
809
810
		if (!DolibarrApiAccess::$user->rights->societe->lire) {
811
			throw new RestException(401);
812
		}
813
814
		if (empty($id)) {
815
			throw new RestException(400, 'Thirdparty ID is mandatory');
816
		}
817
818
		if (!DolibarrApi::_checkAccessToResource('societe', $id)) {
819
			throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
820
		}
821
822
		$result = $this->company->fetch($id);
823
		if (!$result) {
824
			throw new RestException(404, 'Thirdparty not found');
825
		}
826
827
		$result = $this->company->getOutstandingProposals($mode);
828
829
		unset($result['total_ht']);
830
		unset($result['total_ttc']);
831
832
		return $result;
833
	}
834
835
836
	/**
837
	 * Get outstanding orders of thirdparty
838
	 *
839
	 * @param 	int 	$id			ID of the thirdparty
840
	 * @param 	string 	$mode		'customer' or 'supplier'
841
	 *
842
	 * @url     GET {id}/outstandingorders
843
	 *
844
	 * @return array  				List of outstandings orders of thirdparty
845
	 *
846
	 * @throws RestException 400
847
	 * @throws RestException 401
848
	 * @throws RestException 404
849
	 */
850
    public function getOutStandingOrder($id, $mode = 'customer')
851
	{
852
		$obj_ret = array();
853
854
		if (!DolibarrApiAccess::$user->rights->societe->lire) {
855
			throw new RestException(401);
856
		}
857
858
		if (empty($id)) {
859
			throw new RestException(400, 'Thirdparty ID is mandatory');
860
		}
861
862
		if (!DolibarrApi::_checkAccessToResource('societe', $id)) {
863
			throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
864
		}
865
866
		$result = $this->company->fetch($id);
867
		if (!$result) {
868
			throw new RestException(404, 'Thirdparty not found');
869
		}
870
871
		$result = $this->company->getOutstandingOrders($mode);
872
873
		unset($result['total_ht']);
874
		unset($result['total_ttc']);
875
876
		return $result;
877
	}
878
879
	/**
880
	 * Get outstanding invoices of thirdparty
881
	 *
882
	 * @param 	int 	$id			ID of the thirdparty
883
	 * @param 	string 	$mode		'customer' or 'supplier'
884
	 *
885
	 * @url     GET {id}/outstandinginvoices
886
	 *
887
	 * @return array  				List of outstandings invoices of thirdparty
888
	 *
889
	 * @throws RestException 400
890
	 * @throws RestException 401
891
	 * @throws RestException 404
892
	 */
893
    public function getOutStandingInvoices($id, $mode = 'customer')
894
	{
895
		$obj_ret = array();
896
897
		if (!DolibarrApiAccess::$user->rights->societe->lire) {
898
			throw new RestException(401);
899
		}
900
901
		if (empty($id)) {
902
			throw new RestException(400, 'Thirdparty ID is mandatory');
903
		}
904
905
		if (!DolibarrApi::_checkAccessToResource('societe', $id)) {
906
			throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
907
		}
908
909
		$result = $this->company->fetch($id);
910
		if (!$result) {
911
			throw new RestException(404, 'Thirdparty not found');
912
		}
913
914
		$result = $this->company->getOutstandingBills($mode);
915
916
		unset($result['total_ht']);
917
		unset($result['total_ttc']);
918
919
		return $result;
920
	}
921
922
	/**
923
	 * Get representatives of thirdparty
924
	 *
925
	 * @param 	int 	$id			ID of the thirdparty
926
	 * @param 	string 	$mode		0=Array with properties, 1=Array of id.
927
	 *
928
	 * @url     GET {id}/representatives
929
	 *
930
	 * @return array  				List of representatives of thirdparty
931
	 *
932
	 * @throws RestException 400
933
	 * @throws RestException 401
934
	 * @throws RestException 404
935
	 */
936
    public function getSalesRepresentatives($id, $mode = 0)
937
	{
938
		$obj_ret = array();
939
940
		if (!DolibarrApiAccess::$user->rights->societe->lire) {
941
			throw new RestException(401);
942
		}
943
944
		if (empty($id)) {
945
			throw new RestException(400, 'Thirdparty ID is mandatory');
946
		}
947
948
		if (!DolibarrApi::_checkAccessToResource('societe', $id)) {
949
			throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
950
		}
951
952
		$result = $this->company->fetch($id);
953
		if (!$result) {
954
			throw new RestException(404, 'Thirdparty not found');
955
		}
956
957
		$result = $this->company->getSalesRepresentatives(DolibarrApiAccess::$user, $mode);
958
959
		return $result;
960
	}
961
962
	/**
963
	 * Get fixed amount discount of a thirdparty (all sources: deposit, credit note, commercial offers...)
964
	 *
965
	 * @param 	int 	$id             ID of the thirdparty
966
	 * @param 	string 	$filter    	Filter exceptional discount. "none" will return every discount, "available" returns unapplied discounts, "used" returns applied discounts   {@choice none,available,used}
967
	 * @param   string  $sortfield  	Sort field
968
	 * @param   string  $sortorder  	Sort order
969
	 *
970
	 * @url     GET {id}/fixedamountdiscounts
971
	 *
972
	 * @return array  List of fixed discount of thirdparty
973
	 *
974
	 * @throws RestException 400
975
	 * @throws RestException 401
976
	 * @throws RestException 404
977
	 * @throws RestException 503
978
	 */
979
    public function getFixedAmountDiscounts($id, $filter = "none", $sortfield = "f.type", $sortorder = 'ASC')
980
	{
981
		$obj_ret = array();
982
983
		if (!DolibarrApiAccess::$user->rights->societe->lire) {
984
			throw new RestException(401);
985
		}
986
987
		if (empty($id)) {
988
			throw new RestException(400, 'Thirdparty ID is mandatory');
989
		}
990
991
		if (!DolibarrApi::_checkAccessToResource('societe', $id)) {
992
			throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
993
		}
994
995
		$result = $this->company->fetch($id);
996
		if (!$result) {
997
			throw new RestException(404, 'Thirdparty not found');
998
		}
999
1000
1001
		$sql = "SELECT f.ref, f.type as factype, re.fk_facture_source, re.rowid, re.amount_ht, re.amount_tva, re.amount_ttc, re.description, re.fk_facture, re.fk_facture_line";
1002
		$sql .= " FROM ".MAIN_DB_PREFIX."societe_remise_except as re, ".MAIN_DB_PREFIX."facture as f";
1003
		$sql .= " WHERE f.rowid = re.fk_facture_source AND re.fk_soc = ".$id;
1004
		if ($filter == "available")  $sql .= " AND re.fk_facture IS NULL AND re.fk_facture_line IS NULL";
1005
		if ($filter == "used")  $sql .= " AND (re.fk_facture IS NOT NULL OR re.fk_facture_line IS NOT NULL)";
1006
1007
		$sql .= $this->db->order($sortfield, $sortorder);
1008
1009
		$result = $this->db->query($sql);
1010
		if (!$result) {
1011
			throw new RestException(503, $this->db->lasterror());
1012
		} else {
1013
			$num = $this->db->num_rows($result);
1014
			while ($obj = $this->db->fetch_object($result)) {
1015
				$obj_ret[] = $obj;
1016
			}
1017
		}
1018
1019
		return $obj_ret;
1020
	}
1021
1022
1023
1024
	/**
1025
	 * Return list of invoices qualified to be replaced by another invoice.
1026
	 *
1027
	 * @param int   $id             Id of thirdparty
1028
	 *
1029
	 * @url     GET {id}/getinvoicesqualifiedforreplacement
1030
	 *
1031
	 * @return array
1032
	 * @throws RestException 400
1033
	 * @throws RestException 401
1034
	 * @throws RestException 404
1035
	 * @throws RestException 405
1036
	 */
1037
    public function getInvoicesQualifiedForReplacement($id)
1038
    {
1039
		if (!DolibarrApiAccess::$user->rights->facture->lire) {
1040
			throw new RestException(401);
1041
		}
1042
		if (empty($id)) {
1043
			throw new RestException(400, 'Thirdparty ID is mandatory');
1044
		}
1045
1046
		if (!DolibarrApi::_checkAccessToResource('societe', $id)) {
1047
			throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
1048
		}
1049
1050
		/*$result = $this->thirdparty->fetch($id);
1051
		 if( ! $result ) {
1052
		 throw new RestException(404, 'Thirdparty not found');
1053
		 }*/
1054
1055
		$invoice = new Facture($this->db);
1056
		$result = $invoice->list_replacable_invoices($id);
1057
		if ($result < 0) {
1058
			throw new RestException(405, $this->thirdparty->error);
0 ignored issues
show
Bug Best Practice introduced by
The property thirdparty does not exist on Thirdparties. Did you maybe forget to declare it?
Loading history...
1059
		}
1060
1061
		return $result;
1062
	}
1063
1064
	/**
1065
	 * Return list of invoices qualified to be corrected by a credit note.
1066
	 * Invoices matching the following rules are returned
1067
	 * (validated + payment on process) or classified (payed completely or payed partialy) + not already replaced + not already a credit note
1068
	 *
1069
	 * @param int   $id             Id of thirdparty
1070
	 *
1071
	 * @url     GET {id}/getinvoicesqualifiedforcreditnote
1072
	 *
1073
	 * @return array
1074
	 *
1075
	 * @throws RestException 400
1076
	 * @throws RestException 401
1077
	 * @throws RestException 404
1078
	 * @throws RestException 405
1079
	 */
1080
    public function getInvoicesQualifiedForCreditNote($id)
1081
    {
1082
		if (!DolibarrApiAccess::$user->rights->facture->lire) {
1083
			throw new RestException(401);
1084
		}
1085
		if (empty($id)) {
1086
			throw new RestException(400, 'Thirdparty ID is mandatory');
1087
		}
1088
1089
		if (!DolibarrApi::_checkAccessToResource('societe', $id)) {
1090
			throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
1091
		}
1092
1093
		/*$result = $this->thirdparty->fetch($id);
1094
		 if( ! $result ) {
1095
		 throw new RestException(404, 'Thirdparty not found');
1096
		 }*/
1097
1098
		$invoice = new Facture($this->db);
1099
		$result = $invoice->list_qualified_avoir_invoices($id);
1100
		if ($result < 0) {
1101
			throw new RestException(405, $this->thirdparty->error);
0 ignored issues
show
Bug Best Practice introduced by
The property thirdparty does not exist on Thirdparties. Did you maybe forget to declare it?
Loading history...
1102
		}
1103
1104
		return $result;
1105
	}
1106
1107
	/**
1108
	 * Get CompanyBankAccount objects for thirdparty
1109
	 *
1110
	 * @param int $id ID of thirdparty
1111
	 *
1112
	 * @return array
1113
	 *
1114
	 * @url GET {id}/bankaccounts
1115
	 */
1116
    public function getCompanyBankAccount($id)
1117
    {
1118
		global $db, $conf;
1119
1120
		if (!DolibarrApiAccess::$user->rights->facture->lire) {
1121
			throw new RestException(401);
1122
		}
1123
		if (empty($id)) {
1124
			throw new RestException(400, 'Thirdparty ID is mandatory');
1125
		}
1126
1127
		if (!DolibarrApi::_checkAccessToResource('societe', $id)) {
1128
			throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
1129
		}
1130
1131
		/**
1132
		 * We select all the records that match the socid
1133
		 */
1134
1135
		$sql = "SELECT rowid, fk_soc, bank, number, code_banque, code_guichet, cle_rib, bic, iban_prefix as iban, domiciliation, proprio,";
1136
		$sql .= " owner_address, default_rib, label, datec, tms as datem, rum, frstrecur";
1137
		$sql .= " FROM ".MAIN_DB_PREFIX."societe_rib";
1138
		if ($id) $sql .= " WHERE fk_soc  = ".$id." ";
1139
1140
1141
		$result = $db->query($sql);
1142
1143
		if ($result->num_rows == 0) {
1144
			throw new RestException(404, 'Account not found');
1145
		}
1146
1147
		$i = 0;
1148
1149
		$accounts = array();
1150
1151
		if ($result)
1152
		{
1153
			$num = $db->num_rows($result);
1154
			while ($i < $num)
1155
			{
1156
				$obj = $db->fetch_object($result);
1157
				$account = new CompanyBankAccount($db);
1158
				if ($account->fetch($obj->rowid)) {
1159
					$accounts[] = $account;
1160
				}
1161
				$i++;
1162
			}
1163
		} else {
1164
			throw new RestException(404, 'Account not found');
1165
		}
1166
1167
1168
		$fields = array('socid', 'default_rib', 'frstrecur', '1000110000001', 'datec', 'datem', 'label', 'bank', 'bic', 'iban', 'id', 'rum');
1169
1170
		$returnAccounts = array();
1171
1172
		foreach ($accounts as $account) {
1173
			$object = array();
1174
			foreach ($account as $key => $value) {
1175
				if (in_array($key, $fields)) {
1176
					$object[$key] = $value;
1177
				}
1178
			}
1179
			$returnAccounts[] = $object;
1180
		}
1181
1182
		return $returnAccounts;
1183
	}
1184
1185
	/**
1186
	 * Create CompanyBankAccount object for thirdparty
1187
	 * @param int  $id ID of thirdparty
1188
	 * @param array $request_data Request data
1189
	 *
1190
	 * @return object  BankAccount of thirdparty
1191
	 *
1192
	 * @url POST {id}/bankaccounts
1193
	 */
1194
    public function createCompanyBankAccount($id, $request_data = null)
1195
	{
1196
		if (!DolibarrApiAccess::$user->rights->societe->creer) {
1197
			throw new RestException(401);
1198
		}
1199
		if ($this->company->fetch($id) <= 0) {
1200
			throw new RestException(404, 'Error creating Company Bank account, Company doesn\'t exists');
1201
		}
1202
		$account = new CompanyBankAccount($this->db);
1203
1204
		$account->socid = $id;
1205
1206
		foreach ($request_data as $field => $value) {
1207
			$account->$field = $value;
1208
		}
1209
1210
		if ($account->create(DolibarrApiAccess::$user) < 0)
1211
			throw new RestException(500, 'Error creating Company Bank account');
1212
1213
		if (empty($account->rum)) {
1214
			require_once DOL_DOCUMENT_ROOT.'/compta/prelevement/class/bonprelevement.class.php';
1215
			$prelevement = new BonPrelevement($this->db);
1216
			$account->rum = $prelevement->buildRumNumber($this->company->code_client, $account->datec, $account->id);
1217
			$account->date_rum = dol_now();
1218
		}
1219
1220
		if ($account->update(DolibarrApiAccess::$user) < 0)
1221
			throw new RestException(500, 'Error updating values');
1222
1223
		return $this->_cleanObjectDatas($account);
1224
	}
1225
1226
	/**
1227
	 * Update CompanyBankAccount object for thirdparty
1228
	 *
1229
	 * @param int $id ID of thirdparty
1230
	 * @param int  $bankaccount_id ID of CompanyBankAccount
1231
	 * @param array $request_data Request data
1232
	 *
1233
	 * @return object  BankAccount of thirdparty
1234
	 *
1235
	 * @url PUT {id}/bankaccounts/{bankaccount_id}
1236
	 */
1237
    public function updateCompanyBankAccount($id, $bankaccount_id, $request_data = null)
1238
	{
1239
		if (!DolibarrApiAccess::$user->rights->societe->creer) {
1240
			throw new RestException(401);
1241
		}
1242
		if ($this->company->fetch($id) <= 0) {
1243
			throw new RestException(404, 'Error creating Company Bank account, Company doesn\'t exists');
1244
		}
1245
		$account = new CompanyBankAccount($this->db);
1246
1247
		$account->fetch($bankaccount_id, $id, -1, '');
1248
1249
		if ($account->socid != $id) {
1250
			throw new RestException(401);
1251
		}
1252
1253
1254
		foreach ($request_data as $field => $value) {
1255
			$account->$field = $value;
1256
		}
1257
1258
		if (empty($account->rum)) {
1259
			require_once DOL_DOCUMENT_ROOT.'/compta/prelevement/class/bonprelevement.class.php';
1260
			$prelevement = new BonPrelevement($this->db);
1261
			$account->rum = $prelevement->buildRumNumber($this->company->code_client, $account->datec, $account->id);
1262
			$account->date_rum = dol_now();
1263
		}
1264
1265
		if ($account->update(DolibarrApiAccess::$user) < 0)
1266
			throw new RestException(500, 'Error updating values');
1267
1268
		return $this->_cleanObjectDatas($account);
1269
	}
1270
1271
	/**
1272
	 * Delete a bank account attached to a thirdparty
1273
	 *
1274
	 * @param int $id ID of thirdparty
1275
	 * @param int $bankaccount_id ID of CompanyBankAccount
1276
	 *
1277
	 * @return int -1 if error 1 if correct deletion
1278
	 *
1279
	 * @url DELETE {id}/bankaccounts/{bankaccount_id}
1280
	 */
1281
    public function deleteCompanyBankAccount($id, $bankaccount_id)
1282
    {
1283
		if (!DolibarrApiAccess::$user->rights->societe->creer) {
1284
			throw new RestException(401);
1285
		}
1286
1287
		$account = new CompanyBankAccount($this->db);
1288
1289
		$account->fetch($bankaccount_id);
1290
1291
		if (!$account->socid == $id)
1292
			throw new RestException(401);
1293
1294
		return $account->delete(DolibarrApiAccess::$user);
1295
	}
1296
1297
	/**
1298
	 * Generate a Document from a bank account record (like SEPA mandate)
1299
	 *
1300
	 * @param int 		$id 			Thirdparty id
1301
	 * @param int 		$companybankid 	Companybank id
1302
	 * @param string 	$model 			Model of document to generate
1303
	 * @return void
1304
	 *
1305
	 * @url GET {id}/generateBankAccountDocument/{companybankid}/{model}
1306
	 */
1307
	public function generateBankAccountDocument($id, $companybankid = null, $model = 'sepamandate')
1308
	{
1309
		global $conf;
1310
1311
		$this->langs->loadLangs(array("main", "dict", "commercial", "products", "companies", "banks", "bills", "withdrawals"));
0 ignored issues
show
Bug Best Practice introduced by
The property langs does not exist on Thirdparties. Did you maybe forget to declare it?
Loading history...
1312
1313
		$this->company->fetch($id);
1314
1315
		$action = 'builddoc';
1316
		if (!DolibarrApiAccess::$user->rights->societe->creer)
1317
			throw new RestException(401);
1318
1319
		$this->company->setDocModel(DolibarrApiAccess::$user, $model);
1320
1321
		$this->company->fk_bank = $this->company->fk_account;
0 ignored issues
show
Bug introduced by
The property fk_bank does not seem to exist on Societe.
Loading history...
1322
1323
		$outputlangs = $this->langs;
1324
		$newlang = '';
1325
1326
		if ($this->conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id', 'aZ09')) $newlang = GETPOST('lang_id', 'aZ09');
0 ignored issues
show
Bug Best Practice introduced by
The property conf does not exist on Thirdparties. Did you maybe forget to declare it?
Loading history...
1327
		if ($this->conf->global->MAIN_MULTILANGS && empty($newlang) && isset($this->company->thirdparty->default_lang)) $newlang = $this->company->thirdparty->default_lang; // for proposal, order, invoice, ...
1328
		if ($this->conf->global->MAIN_MULTILANGS && empty($newlang) && isset($this->company->default_lang)) $newlang = $this->company->default_lang; // for thirdparty
1329
		if (!empty($newlang)) {
1330
			$outputlangs = new Translate("", $conf);
1331
			$outputlangs->setDefaultLang($newlang);
1332
		}
1333
1334
		// To be sure vars is defined
1335
		$hidedetails = $hidedesc = $hideref = 0;
1336
		$moreparams = null;
1337
		if (empty($hidedetails)) $hidedetails = 0;
1338
		if (empty($hidedesc)) $hidedesc = 0;
1339
		if (empty($hideref)) $hideref = 0;
1340
		if (empty($moreparams)) $moreparams = null;
0 ignored issues
show
introduced by
The condition empty($moreparams) is always false.
Loading history...
1341
1342
1343
		$sql = "SELECT rowid";
1344
		$sql .= " FROM ".MAIN_DB_PREFIX."societe_rib";
1345
		if ($id) $sql .= " WHERE fk_soc  = ".$id." ";
1346
		if ($companybankid) $sql .= " AND id = ".$companybankid."";
1347
1348
		$i = 0;
1349
		$accounts = array();
1350
1351
		$result = $this->db->query($sql);
1352
		if ($result)
1353
		{
1354
			if ($result->num_rows == 0) {
1355
				throw new RestException(404, 'Bank account not found');
1356
			}
1357
1358
			$num = $this->db->num_rows($result);
1359
			while ($i < $num)
1360
			{
1361
				$obj = $this->db->fetch_object($result);
1362
1363
				$account = new CompanyBankAccount($this->db);
1364
				if ($account->fetch($obj->rowid)) {
1365
					$accounts[] = $account;
1366
				}
1367
				$i++;
1368
			}
1369
		} else {
1370
			throw new RestException(404, 'Bank account not found');
1371
		}
1372
1373
		$moreparams = array(
1374
			'use_companybankid'=>$accounts[0]->id,
1375
			'force_dir_output'=>$this->conf->societe->multidir_output[$this->company->entity].'/'.dol_sanitizeFileName($this->company->id)
1376
		);
1377
1378
		$result = 0;
1379
1380
		$result = $this->company->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
1381
1382
		if ($result > 0)
1383
		{
1384
			return array("success" => $result);
1385
		} else {
1386
			throw new RestException(500);
1387
		}
1388
    }
1389
1390
    /**
1391
	 * Get a specific gateway attached to a thirdparty (by specifying the site key)
1392
	 *
1393
	 * @param int $id ID of thirdparty
1394
	 * @param string $site Site key
1395
	 *
1396
	 * @return SocieteAccount[]
1397
	 * @throws RestException 401 Unauthorized: User does not have permission to read thirdparties
1398
	 * @throws RestException 404 Not Found: Specified thirdparty ID does not belongs to an existing thirdparty
1399
	 *
1400
	 * @url GET {id}/gateways/
1401
	 */
1402
    public function getSocieteAccounts($id, $site = null)
1403
    {
1404
		global $db, $conf;
1405
1406
		if (!DolibarrApiAccess::$user->rights->societe->lire) {
1407
			throw new RestException(401);
1408
		}
1409
1410
		if (!DolibarrApi::_checkAccessToResource('societe', $id)) {
1411
			throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
1412
		}
1413
1414
		/**
1415
		 * We select all the records that match the socid
1416
		 */
1417
		$sql = "SELECT rowid, fk_soc, key_account, site, date_creation, tms FROM ".MAIN_DB_PREFIX."societe_account";
1418
		$sql .= " WHERE fk_soc = $id";
1419
		if ($site) $sql .= " AND site ='$site'";
1420
1421
		$result = $db->query($sql);
1422
1423
		if ($result->num_rows == 0) {
1424
			throw new RestException(404, 'This thirdparty does not have any gateway attached or does not exist.');
1425
		}
1426
1427
		$i = 0;
1428
1429
		$accounts = array();
1430
1431
		$num = $db->num_rows($result);
1432
		while ($i < $num)
1433
		{
1434
			$obj = $db->fetch_object($result);
1435
			$account = new SocieteAccount($db);
1436
1437
			if ($account->fetch($obj->rowid)) {
1438
				$accounts[] = $account;
1439
			}
1440
			$i++;
1441
		}
1442
1443
		$fields = array('id', 'fk_soc', 'key_account', 'site', 'date_creation', 'tms');
1444
1445
		$returnAccounts = array();
1446
1447
		foreach ($accounts as $account) {
1448
			$object = array();
1449
			foreach ($account as $key => $value) {
1450
				if (in_array($key, $fields)) {
1451
					$object[$key] = $value;
1452
				}
1453
			}
1454
			$returnAccounts[] = $object;
1455
		}
1456
1457
		return $returnAccounts;
1458
	}
1459
1460
	/**
1461
	 * Create and attach a new gateway to an existing thirdparty
1462
	 *
1463
	 * Possible fields for request_data (request body) are specified in <code>llx_societe_account</code> table.<br>
1464
	 * See <a href="https://wiki.dolibarr.org/index.php/Table_llx_societe_account">Table llx_societe_account</a> wiki page for more information<br><br>
1465
	 * <u>Example body payload :</u> <pre>{"key_account": "cus_DAVkLSs1LYyYI", "site": "stripe"}</pre>
1466
	 *
1467
	 * @param int $id ID of thirdparty
1468
	 * @param array $request_data Request data
1469
	 *
1470
	 * @return SocieteAccount
1471
	 *
1472
	 * @throws RestException 401 Unauthorized: User does not have permission to read thirdparties
1473
	 * @throws RestException 409 Conflict: A SocieteAccount entity (gateway) already exists for this company and site.
1474
	 * @throws RestException 422 Unprocessable Entity: You must pass the site attribute in your request data !
1475
	 * @throws RestException 500 Internal Server Error: Error creating SocieteAccount account
1476
	 *
1477
	 * @url POST {id}/gateways
1478
	 */
1479
    public function createSocieteAccount($id, $request_data = null)
1480
	{
1481
		global $db;
1482
1483
		if (!DolibarrApiAccess::$user->rights->societe->creer) {
1484
			throw new RestException(401);
1485
		}
1486
1487
		if (!isset($request_data['site'])) {
1488
			throw new RestException(422, 'Unprocessable Entity: You must pass the site attribute in your request data !');
1489
		}
1490
1491
		$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."societe_account WHERE fk_soc  = ".$id." AND site = '".$request_data['site']."' ";
1492
		$result = $db->query($sql);
1493
1494
		if ($result->num_rows == 0) {
1495
			$account = new SocieteAccount($this->db);
1496
			if (!isset($request_data['login'])) {
1497
				$account->login = "";
1498
			}
1499
			$account->fk_soc = $id;
1500
1501
			foreach ($request_data as $field => $value) {
1502
				$account->$field = $value;
1503
			}
1504
1505
			if ($account->create(DolibarrApiAccess::$user) < 0)
1506
				throw new RestException(500, 'Error creating SocieteAccount entity. Ensure that the ID of thirdparty provided does exist!');
1507
1508
			$this->_cleanObjectDatas($account);
1509
1510
			return $account;
1511
		} else {
1512
			throw new RestException(409, 'A SocieteAccount entity already exists for this company and site.');
1513
		}
1514
	}
1515
1516
	/**
1517
	 * Create and attach a new (or replace an existing) specific site gateway to a thirdparty
1518
	 *
1519
	 * You <strong>MUST</strong> pass all values to keep (otherwise, they will be deleted) !<br>
1520
	 * If you just need to update specific fields prefer <code>PATCH /thirdparties/{id}/gateways/{site}</code> endpoint.<br><br>
1521
	 * When a <strong>SocieteAccount</strong> entity does not exist for the <code>id</code> and <code>site</code>
1522
	 * supplied, a new one will be created. In that case <code>fk_soc</code> and <code>site</code> members form
1523
	 * request body payload will be ignored and <code>id</code> and <code>site</code> query strings parameters
1524
	 * will be used instead.
1525
	 *
1526
	 * @param int $id ID of thirdparty
1527
	 * @param string $site Site key
1528
	 * @param array $request_data Request data
1529
	 *
1530
	 * @return SocieteAccount
1531
	 *
1532
	 * @throws RestException 401 Unauthorized: User does not have permission to read thirdparties
1533
	 * @throws RestException 422 Unprocessable Entity: You must pass the site attribute in your request data !
1534
	 * @throws RestException 500 Internal Server Error: Error updating SocieteAccount entity
1535
	 *
1536
	 * @url PUT {id}/gateways/{site}
1537
	 */
1538
    public function putSocieteAccount($id, $site, $request_data = null)
1539
	{
1540
		global $db;
1541
1542
		if (!DolibarrApiAccess::$user->rights->societe->creer) {
1543
			throw new RestException(401);
1544
		}
1545
1546
		$sql = "SELECT rowid, fk_user_creat, date_creation FROM ".MAIN_DB_PREFIX."societe_account WHERE fk_soc = $id AND site = '$site' ";
1547
		$result = $db->query($sql);
1548
1549
		// We do not found an existing SocieteAccount entity for this fk_soc and site ; we then create a new one.
1550
		if ($result->num_rows == 0) {
1551
			if (!isset($request_data['key_account'])) {
1552
				throw new RestException(422, 'Unprocessable Entity: You must pass the key_account attribute in your request data !');
1553
			}
1554
			$account = new SocieteAccount($this->db);
1555
			if (!isset($request_data['login'])) {
1556
				$account->login = "";
1557
			}
1558
1559
			foreach ($request_data as $field => $value) {
1560
				$account->$field = $value;
1561
			}
1562
1563
			$account->fk_soc = $id;
1564
			$account->site = $site;
1565
1566
			if ($account->create(DolibarrApiAccess::$user) < 0) {
1567
				throw new RestException(500, 'Error creating SocieteAccount entity.');
1568
			}
1569
			// We found an existing SocieteAccount entity, we are replacing it
1570
		} else {
1571
			if (isset($request_data['site']) && $request_data['site'] !== $site) {
1572
				$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."societe_account WHERE fk_soc  = ".$id." AND site = '".$request_data['site']."' ";
1573
				$result = $db->query($sql);
1574
1575
				if ($result->num_rows !== 0) {
1576
					throw new RestException(409, "You are trying to update this thirdparty SocieteAccount (gateway record) from $site to ".$request_data['site']." but another SocieteAccount entity already exists with this site key.");
1577
				}
1578
			}
1579
1580
			$obj = $db->fetch_object($result);
1581
1582
			$account = new SocieteAccount($this->db);
1583
			$account->id = $obj->rowid;
1584
			$account->fk_soc = $id;
1585
			$account->site = $site;
1586
			if (!isset($request_data['login'])) {
1587
				$account->login = "";
1588
			}
1589
			$account->fk_user_creat = $obj->fk_user_creat;
1590
			$account->date_creation = $obj->date_creation;
1591
1592
			foreach ($request_data as $field => $value) {
1593
				$account->$field = $value;
1594
			}
1595
1596
			if ($account->update(DolibarrApiAccess::$user) < 0)
1597
				throw new RestException(500, 'Error updating SocieteAccount entity.');
1598
		}
1599
1600
		$this->_cleanObjectDatas($account);
1601
1602
		return $account;
1603
	}
1604
1605
	/**
1606
	 * Update specified values of a specific site gateway attached to a thirdparty
1607
	 *
1608
	 * @param int $id Id of thirdparty
1609
	 * @param string  $site Site key
1610
	 * @param array $request_data Request data
1611
	 *
1612
	 * @return SocieteAccount
1613
	 *
1614
	 * @throws RestException 401 Unauthorized: User does not have permission to read thirdparties
1615
	 * @throws RestException 404 Not Found: Specified thirdparty ID does not belongs to an existing thirdparty
1616
	 * @throws RestException 409 Conflict: Another SocieteAccount entity already exists for this thirdparty with this site key.
1617
	 * @throws RestException 500 Internal Server Error: Error updating SocieteAccount entity
1618
	 *
1619
	 * @url PATCH {id}/gateways/{site}
1620
	 */
1621
    public function patchSocieteAccount($id, $site, $request_data = null)
1622
	{
1623
		global $db;
1624
1625
		if (!DolibarrApiAccess::$user->rights->societe->creer) {
1626
			throw new RestException(401);
1627
		}
1628
1629
		$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."societe_account WHERE fk_soc  = $id AND site = '$site' ";
1630
		$result = $db->query($sql);
1631
1632
		if ($result->num_rows == 0) {
1633
			throw new RestException(404, "This thirdparty does not have $site gateway attached or does not exist.");
1634
		} else {
1635
			// If the user tries to edit the site member, we check first if
1636
			if (isset($request_data['site']) && $request_data['site'] !== $site) {
1637
				$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."societe_account WHERE fk_soc  = ".$id." AND site = '".$request_data['site']."' ";
1638
				$result = $db->query($sql);
1639
1640
				if ($result->num_rows !== 0)
1641
					throw new RestException(409, "You are trying to update this thirdparty SocieteAccount (gateway record) site member from $site to ".$request_data['site']." but another SocieteAccount entity already exists for this thirdparty with this site key.");
1642
			}
1643
1644
			$obj = $db->fetch_object($result);
1645
			$account = new SocieteAccount($this->db);
1646
			$account->fetch($obj->rowid);
1647
1648
			foreach ($request_data as $field => $value) {
1649
				$account->$field = $value;
1650
			}
1651
1652
			if ($account->update(DolibarrApiAccess::$user) < 0)
1653
				throw new RestException(500, 'Error updating SocieteAccount account');
1654
1655
			$this->_cleanObjectDatas($account);
1656
1657
			return $account;
1658
		}
1659
	}
1660
1661
	/**
1662
	 * Delete a specific site gateway attached to a thirdparty (by gateway id)
1663
	 *
1664
	 * @param int $id ID of thirdparty
1665
	 * @param int $site Site key
1666
	 *
1667
	 * @return void
1668
	 * @throws RestException 401 Unauthorized: User does not have permission to delete thirdparties gateways
1669
	 * @throws RestException 404 Not Found: Specified thirdparty ID does not belongs to an existing thirdparty
1670
	 * @throws RestException 500 Internal Server Error: Error deleting SocieteAccount entity
1671
	 *
1672
	 * @url DELETE {id}/gateways/{site}
1673
	 */
1674
    public function deleteSocieteAccount($id, $site)
1675
    {
1676
		global /** @var Database $db */
1677
		$db;
1678
1679
		if (!DolibarrApiAccess::$user->rights->societe->creer) {
1680
			throw new RestException(401);
1681
		}
1682
1683
		$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."societe_account WHERE fk_soc  = $id AND site = '$site' ";
1684
		$result = $db->query($sql);
1685
1686
		if ($result->num_rows == 0) {
1687
			throw new RestException(404);
1688
		} else {
1689
			$obj = $db->fetch_object($result);
1690
			$account = new SocieteAccount($this->db);
1691
			$account->fetch($obj->rowid);
1692
1693
			if ($account->delete(DolibarrApiAccess::$user) < 0) {
1694
				throw new RestException(500, "Error while deleting $site gateway attached to this third party");
1695
			}
1696
		}
1697
	}
1698
1699
	/**
1700
	 * Delete all gateways attached to a thirdparty
1701
	 *
1702
	 * @param int $id ID of thirdparty
1703
	 *
1704
	 * @return void
1705
	 * @throws RestException(401) Unauthorized: User does not have permission to delete thirdparties gateways
1706
	 * @throws RestException(404) Not Found: Specified thirdparty ID does not belongs to an existing thirdparty
1707
	 * @throws RestException(500) Internal Server Error: Error deleting SocieteAccount entity
1708
	 *
1709
	 * @url DELETE {id}/gateways
1710
	 */
1711
    public function deleteSocieteAccounts($id)
1712
    {
1713
		global /** @var Database $db */
1714
		$db;
1715
1716
		if (!DolibarrApiAccess::$user->rights->societe->creer) {
1717
			throw new RestException(401);
1718
		}
1719
1720
		/**
1721
		 * We select all the records that match the socid
1722
		 */
1723
1724
		$sql = "SELECT rowid, fk_soc, key_account, site, date_creation, tms";
1725
		$sql .= " FROM ".MAIN_DB_PREFIX."societe_account WHERE fk_soc  = $id ";
1726
1727
		$result = $db->query($sql);
1728
1729
		if ($result->num_rows == 0) {
1730
			throw new RestException(404, 'This third party does not have any gateway attached or does not exist.');
1731
		} else {
1732
			$i = 0;
1733
1734
			$num = $db->num_rows($result);
1735
			while ($i < $num)
1736
			{
1737
				$obj = $db->fetch_object($result);
1738
				$account = new SocieteAccount($db);
1739
				$account->fetch($obj->rowid);
1740
1741
				if ($account->delete(DolibarrApiAccess::$user) < 0) {
1742
					throw new RestException(500, 'Error while deleting gateways attached to this third party');
1743
				}
1744
				$i++;
1745
			}
1746
		}
1747
	}
1748
1749
    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
1750
	/**
1751
	 * Clean sensible object datas
1752
	 *
1753
	 * @param   object  $object    Object to clean
1754
	 * @return    array    Array of cleaned object properties
1755
	 */
1756
	protected function _cleanObjectDatas($object)
1757
    {
1758
        // phpcs:enable
1759
		$object = parent::_cleanObjectDatas($object);
1760
1761
		unset($object->nom); // ->name already defined and nom deprecated
1762
		unset($object->name_bis); // ->name_alias already defined
1763
		unset($object->note); // ->note_private and note_public already defined
1764
		unset($object->departement);
1765
		unset($object->departement_code);
1766
		unset($object->pays);
1767
		unset($object->particulier);
1768
		unset($object->prefix_comm);
1769
1770
		unset($object->commercial_id); // This property is used in create/update only. It does not exists in read mode because there is several sales representatives.
1771
1772
		unset($object->total_ht);
1773
		unset($object->total_tva);
1774
		unset($object->total_localtax1);
1775
		unset($object->total_localtax2);
1776
		unset($object->total_ttc);
1777
1778
		unset($object->lines);
1779
		unset($object->thirdparty);
1780
1781
		unset($object->fk_delivery_address); // deprecated feature
1782
1783
		return $object;
1784
	}
1785
1786
	/**
1787
	 * Validate fields before create or update object
1788
	 *
1789
	 * @param array $data   Datas to validate
1790
	 * @return array
1791
	 *
1792
	 * @throws RestException
1793
	 */
1794
    private function _validate($data)
1795
    {
1796
        $thirdparty = array();
1797
        foreach (Thirdparties::$FIELDS as $field) {
1798
            if (!isset($data[$field]))
1799
                throw new RestException(400, "$field field missing");
1800
            $thirdparty[$field] = $data[$field];
1801
        }
1802
        return $thirdparty;
1803
    }
1804
1805
    /**
1806
     * Fetch properties of a thirdparty object.
1807
     *
1808
     * Return an array with thirdparty informations
1809
     *
1810
     * @param    int	$rowid      Id of third party to load
1811
	 * @param    string	$ref        Reference of third party, name (Warning, this can return several records)
1812
	 * @param    string	$ref_ext    External reference of third party (Warning, this information is a free field not provided by Dolibarr)
1813
	 * @param    string	$ref_int    Internal reference of third party (not used by dolibarr)
1814
	 * @param    string	$idprof1		Prof id 1 of third party (Warning, this can return several records)
1815
	 * @param    string	$idprof2		Prof id 2 of third party (Warning, this can return several records)
1816
	 * @param    string	$idprof3		Prof id 3 of third party (Warning, this can return several records)
1817
	 * @param    string	$idprof4		Prof id 4 of third party (Warning, this can return several records)
1818
	 * @param    string	$idprof5		Prof id 5 of third party (Warning, this can return several records)
1819
	 * @param    string	$idprof6		Prof id 6 of third party (Warning, this can return several records)
1820
	 * @param    string	$email   		Email of third party (Warning, this can return several records)
1821
	 * @param    string	$ref_alias  Name_alias of third party (Warning, this can return several records)
1822
     * @return array|mixed data without useless information
1823
     *
1824
     * @throws RestException
1825
    */
1826
    private function _fetch($rowid, $ref = '', $ref_ext = '', $ref_int = '', $idprof1 = '', $idprof2 = '', $idprof3 = '', $idprof4 = '', $idprof5 = '', $idprof6 = '', $email = '', $ref_alias = '')
1827
    {
1828
        global $conf;
1829
        if (!DolibarrApiAccess::$user->rights->societe->lire) {
1830
            throw new RestException(401);
1831
        }
1832
1833
        $result = $this->company->fetch($rowid, $ref, $ref_ext, $ref_int, $idprof1, $idprof2, $idprof3, $idprof4, $idprof5, $idprof6, $email, $ref_alias);
1834
        if (!$result) {
1835
            throw new RestException(404, 'Thirdparty not found');
1836
        }
1837
1838
        if (!DolibarrApi::_checkAccessToResource('societe', $this->company->id)) {
1839
            throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
1840
        }
1841
1842
        if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
1843
            $filterabsolutediscount = "fk_facture_source IS NULL"; // If we want deposit to be substracted to payments only and not to total of final invoice
1844
            $filtercreditnote = "fk_facture_source IS NOT NULL"; // If we want deposit to be substracted to payments only and not to total of final invoice
1845
        } else {
1846
            $filterabsolutediscount = "fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
1847
            $filtercreditnote = "fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
1848
        }
1849
1850
        $absolute_discount = $this->company->getAvailableDiscounts('', $filterabsolutediscount);
1851
        $absolute_creditnote = $this->company->getAvailableDiscounts('', $filtercreditnote);
1852
        $this->company->absolute_discount = price2num($absolute_discount, 'MT');
0 ignored issues
show
Bug introduced by
The property absolute_discount does not seem to exist on Societe.
Loading history...
1853
        $this->company->absolute_creditnote = price2num($absolute_creditnote, 'MT');
0 ignored issues
show
Bug introduced by
The property absolute_creditnote does not seem to exist on Societe.
Loading history...
1854
1855
        return $this->_cleanObjectDatas($this->company);
1856
    }
1857
}
1858