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