1<?php
2/* Copyright (C) 2005-2008 Laurent Destailleur  <eldy@users.sourceforge.net>
3 * Copyright (C) 2005-2012 Regis Houssin        <regis.houssin@inodbox.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <https://www.gnu.org/licenses/>.
17 * or see https://www.gnu.org/
18 */
19
20/**
21 *    	\file       htdocs/core/modules/propale/mod_propale_marbre.php
22 *		\ingroup    propale
23 *		\brief      File of class to manage commercial proposal numbering rules Marbre
24 */
25
26require_once DOL_DOCUMENT_ROOT.'/core/modules/supplier_proposal/modules_supplier_proposal.php';
27
28
29/**
30 *	Class to manage customer order numbering rules Marbre
31 */
32class mod_supplier_proposal_marbre extends ModeleNumRefSupplierProposal
33{
34	/**
35	 * Dolibarr version of the loaded document
36	 * @var string
37	 */
38	public $version = 'dolibarr'; // 'development', 'experimental', 'dolibarr'
39
40	public $prefix = 'RQ'; // RQ = Request for quotation
41
42	/**
43	 * @var string Error code (or message)
44	 */
45	public $error = '';
46
47	/**
48	 * @var string Nom du modele
49	 * @deprecated
50	 * @see $name
51	 */
52	public $nom = 'Marbre';
53
54	/**
55	 * @var string model name
56	 */
57	public $name = 'Marbre';
58
59
60	/**
61	 *  Return description of numbering module
62	 *
63	 *  @return     string      Text with description
64	 */
65	public function info()
66	{
67		global $langs;
68		return $langs->trans("SimpleNumRefModelDesc", $this->prefix);
69	}
70
71
72	/**
73	 *  Return an example of numbering module values
74	 *
75	 *  @return     string      Example
76	 */
77	public function getExample()
78	{
79		return $this->prefix."0501-0001";
80	}
81
82
83	/**
84	 *  Checks if the numbers already in the database do not
85	 *  cause conflicts that would prevent this numbering working.
86	 *
87	 *  @return     boolean     false if conflict, true if ok
88	 */
89	public function canBeActivated()
90	{
91		global $conf, $langs, $db;
92
93		$pryymm = '';
94		$max = '';
95
96		$posindice = strlen($this->prefix) + 6;
97		$sql = "SELECT MAX(CAST(SUBSTRING(ref FROM ".$posindice.") AS SIGNED)) as max";
98		$sql .= " FROM ".MAIN_DB_PREFIX."supplier_proposal";
99		$sql .= " WHERE ref LIKE '".$db->escape($this->prefix)."____-%'";
100		$sql .= " AND entity = ".$conf->entity;
101
102		$resql = $db->query($sql);
103		if ($resql) {
104			$row = $db->fetch_row($resql);
105			if ($row) {
106				$pryymm = substr($row[0], 0, 6);
107				$max = $row[0];
108			}
109		}
110
111		if (!$pryymm || preg_match('/'.$this->prefix.'[0-9][0-9][0-9][0-9]/i', $pryymm)) {
112			return true;
113		} else {
114			$langs->load("errors");
115			$this->error = $langs->trans('ErrorNumRefModel', $max);
116			return false;
117		}
118	}
119
120	/**
121	 *  Return next value
122	 *
123	 *  @param	Societe		$objsoc     Object third party
124	 * 	@param	Propal		$supplier_proposal		Object commercial proposal
125	 *  @return string      			Next value
126	 */
127	public function getNextValue($objsoc, $supplier_proposal)
128	{
129		global $db, $conf;
130
131		// First, we get the max value
132		$posindice = strlen($this->prefix) + 6;
133		$sql = "SELECT MAX(CAST(SUBSTRING(ref FROM ".$posindice.") AS SIGNED)) as max"; // This is standard SQL
134		$sql .= " FROM ".MAIN_DB_PREFIX."supplier_proposal";
135		$sql .= " WHERE ref LIKE '".$db->escape($this->prefix)."____-%'";
136		$sql .= " AND entity = ".$conf->entity;
137
138		$resql = $db->query($sql);
139		if ($resql) {
140			$obj = $db->fetch_object($resql);
141			if ($obj) {
142				$max = intval($obj->max);
143			} else {
144				$max = 0;
145			}
146		} else {
147			dol_syslog(get_class($this)."::getNextValue", LOG_DEBUG);
148			return -1;
149		}
150
151		$date = time();
152		$yymm = strftime("%y%m", $date);
153
154		if ($max >= (pow(10, 4) - 1)) {
155			$num = $max + 1; // If counter > 9999, we do not format on 4 chars, we take number as it is
156		} else {
157			$num = sprintf("%04s", $max + 1);
158		}
159
160		dol_syslog(get_class($this)."::getNextValue return ".$this->prefix.$yymm."-".$num);
161		return $this->prefix.$yymm."-".$num;
162	}
163
164	/**
165	 *  Return next free value
166	 *
167	 *  @param	Societe		$objsoc      	Object third party
168	 * 	@param	Object		$objforref		Object for number to search
169	 *  @return string      				Next free value
170	 */
171	public function getNumRef($objsoc, $objforref)
172	{
173		return $this->getNextValue($objsoc, $objforref);
174	}
175}
176