dolibarr 24.0.0-beta
stockcorrection.tpl.php
1<?php
2/* Copyright (C) 2010-2017 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2018-2025 Frédéric France <frederic.france@free.fr>
4 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
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 * $object must be defined
20 * $backtopage
21 */
22
34// Protection to avoid direct call of template
35if (empty($conf) || !is_object($conf)) {
36 print "Error, template page can't be called as URL";
37 exit(1);
38}
39
40'
41@phan-var-force Entrepot|MouvementStock $object
42@phan-var-force FormProduct $formproduct
43@phan-var-force FormProjets $formproject
44@phan-var-force string $backtopage
45';
46
47?>
48
49<!-- BEGIN PHP TEMPLATE PRODUCT/STOCK/TPL/STOCKCORRECTION.TPL.PHP -->
50<?php
51
52$productref = '';
53if ($object->element == 'product') {
55 $productref = (string) $object->ref;
56}
57
58$langs->load("productbatch");
59
60
61if (empty($id)) {
62 $id = $object->id;
63}
64
65$pdluoid = GETPOSTINT('pdluoid');
66
67$pdluo = new Productbatch($db);
68
69if ($pdluoid > 0) {
70 $result = $pdluo->fetch($pdluoid);
71 if ($result > 0) {
72 $pdluoid = $pdluo->id;
73 } else {
74 dol_print_error($db, $pdluo->error, $pdluo->errors);
75 }
76}
77
78$sellByCss = '';
79$eatByCss = '';
80// A date is mandatory when we record the lot the first time. Then once lot and date is recorded
81// a user should be able to manage the lot only (this is main goal of lot)
82/*
83if ($object->sell_or_eat_by_mandatory == Product::SELL_OR_EAT_BY_MANDATORY_ID_SELL_BY) {
84 $sellByCss = 'fieldrequired';
85} elseif ($object->sell_or_eat_by_mandatory == Product::SELL_OR_EAT_BY_MANDATORY_ID_EAT_BY) {
86 $eatByCss = 'fieldrequired';
87} elseif ($object->sell_or_eat_by_mandatory == Product::SELL_OR_EAT_BY_MANDATORY_ID_SELL_AND_EAT) {
88 $sellByCss = 'fieldrequired';
89 $eatByCss = 'fieldrequired';
90}
91*/
92
93$disableSellBy = getDolGlobalInt('PRODUCT_DISABLE_SELLBY');
94$disableEatBy = getDolGlobalInt('PRODUCT_DISABLE_EATBY');
95print '<script type="text/javascript">
96 jQuery(document).ready(function() {
97 function init_price()
98 {
99 if (jQuery("#mouvement").val() == \'0\') jQuery("#unitprice").removeAttr("disabled");
100 else jQuery("#unitprice").prop("disabled", true);
101 }
102 init_price();
103 jQuery("#mouvement").change(function() {
104 console.log("We change the direction of movement");
105 init_price();
106 });
107 jQuery("#nbpiece").keyup(function(event) {
108 console.log("We enter a qty on "+event.key);
109 if ( event.key == "-" ) { /* char - */
110 console.log("We set direction to value 1");
111 jQuery("#nbpiece").val(jQuery("#nbpiece").val().replace("-", ""));
112 jQuery("#mouvement option").removeAttr("selected").change();
113 jQuery("#mouvement option[value=1]").attr("selected","selected").trigger("change");
114 jQuery("#mouvement").trigger("change");
115 } else if ( event.key == "+" ) { /* char + */
116 console.log("We set direction to value 0");
117 jQuery("#nbpiece").val(jQuery("#nbpiece").val().replace("+", ""));
118 jQuery("#mouvement option").removeAttr("selected").change();
119 jQuery("#mouvement option[value=0]").attr("selected","selected").trigger("change");
120 jQuery("#mouvement").trigger("change");
121 }
122 });';
123
124if ($disableSellBy == 0 || $disableEatBy == 0) {
125 print '
126 var disableSellBy = '.dol_escape_js((string) $disableSellBy).';
127 var disableEatBy = '.dol_escape_js((string) $disableSellBy).';
128 jQuery("#batch_number").change(function(event) {
129 var batch = jQuery(this).val();
130 jQuery.getJSON("'.DOL_URL_ROOT.'/product/ajax/product_lot.php?action=search&token='.currentToken().'&product_id='.$id.'&batch="+batch, function(data) {
131 if (data.length > 0) {
132 var productLot = data[0];
133 if (disableSellBy == 0) {
134 jQuery("#sellby").val(productLot.sellby);
135 }
136 if (disableEatBy == 0) {
137 jQuery("#eatby").val(productLot.eatby);
138 }
139 }
140 });
141 });';
142}
143print '});';
144print '</script>';
145
146
147print load_fiche_titre($langs->trans("StockCorrection"), '', 'generic');
148
149print '<form action="'.$_SERVER["PHP_SELF"].'?id='.$id.'" method="post">'."\n";
150
151print dol_get_fiche_head(array(), '', '', 0, '', 0, '', '', 0, '', 0, 'marginbottomonly');
152
153print '<input type="hidden" name="token" value="'.newToken().'">';
154print '<input type="hidden" name="action" value="correct_stock">';
155print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
156if ($pdluoid) {
157 print '<input type="hidden" name="pdluoid" value="'.$pdluoid.'">';
158}
159print '<table class="border centpercent">';
160
161// Warehouse or product
162print '<tr>';
163if ($object->element == 'product') {
165 print '<td class="fieldrequired">'.$langs->trans("Warehouse").'</td>';
166 print '<td>';
167 $ident = (GETPOST("dwid") ? GETPOSTINT("dwid") : (GETPOST('id_entrepot') ? GETPOSTINT('id_entrepot') : ($object->element == 'product' && $object->fk_default_warehouse ? $object->fk_default_warehouse : 'ifone')));
168 if (empty($ident) && getDolGlobalString('MAIN_DEFAULT_WAREHOUSE')) {
169 $ident = getDolGlobalString('MAIN_DEFAULT_WAREHOUSE');
170 }
171 print img_picto('', 'stock', 'class="pictofixedwidth"').$formproduct->selectWarehouses($ident, 'id_entrepot', 'warehouseopen,warehouseinternal', 1, 0, 0, '', 0, 0, array(), 'minwidth100 maxwidth300 widthcentpercentminusx');
172 print '</td>';
173}
174if ($object->element == 'stockmouvement') {
176 print '<td class="fieldrequired">'.$langs->trans("Product").'</td>';
177 print '<td>';
178 print img_picto('', 'product');
179 $form->select_produits(GETPOSTINT('product_id'), 'product_id', (!getDolGlobalString('STOCK_SUPPORTS_SERVICES') ? '0' : ''), 0, 0, -1, 2, '', 0, array(), 0, 1, 0, 'maxwidth500');
180 print '</td>';
181}
182print '<td class="fieldrequired">'.$langs->trans("NumberOfUnit").'</td>';
183print '<td>';
184if ($object->element == 'product' || $object->element == 'stockmouvement') {
186 print '<select name="mouvement" id="mouvement" class="minwidth100 valignmiddle">';
187 print '<option value="0">'.$langs->trans("Add").'</option>';
188 print '<option value="1"'.(GETPOST('mouvement') ? ' selected="selected"' : '').'>'.$langs->trans("Delete").'</option>';
189 print '</select>';
190 print ajax_combobox("mouvement");
191}
192print '<input name="nbpiece" id="nbpiece" class="center valignmiddle maxwidth75" value="'.GETPOST("nbpiece").'">';
193print '</td>';
194print '</tr>';
195
196// If product is a Kit, we ask if we must disable stock change of subproducts
197if (getDolGlobalString('PRODUIT_SOUSPRODUITS') && $object->element == 'product' && $object->hasFatherOrChild(1)) {
199 print '<tr>';
200 print '<td></td>';
201 print '<td colspan="3">';
202 print '<input type="checkbox" name="disablesubproductstockchange" id="disablesubproductstockchange" value="1"'.(GETPOST('disablesubproductstockchange') ? ' checked="checked"' : '').'">';
203 print ' <label for="disablesubproductstockchange">'.$langs->trans("DisableStockChangeOfSubProduct").'</label>';
204 print '</td>';
205 print '</tr>';
206}
207
208// Serial / Eat-by date
209if (isModEnabled('productbatch') &&
210(($object->element == 'product' && $object->hasbatch())
211|| ($object->element == 'stockmouvement'))
212) {
214 print '<tr>';
215 print '<td'.($object->element == 'stockmouvement' ? '' : ' class="fieldrequired"').'>'.$langs->trans("batch_number").'</td><td colspan="3">';
216 if ($pdluoid > 0) {
217 // If form was opened for a specific pdluoid, field is disabled
218 print '<input type="text" name="batch_number_bis" size="40" disabled="disabled" value="'.(GETPOST('batch_number') ? GETPOST('batch_number') : $pdluo->batch).'">';
219 print '<input type="hidden" name="batch_number" value="'.(GETPOST('batch_number') ? GETPOST('batch_number') : $pdluo->batch).'">';
220 } else {
221 print img_picto('', 'barcode', 'class="pictofixedwidth"').'<input type="text" id="batch_number" name="batch_number" class="minwidth300" value="'.(GETPOST('batch_number') ? GETPOST('batch_number') : $pdluo->batch).'">';
222 }
223 print '</td>';
224 print '</tr>';
225
226 print '<tr>';
227 if (!getDolGlobalString('PRODUCT_DISABLE_SELLBY')) {
228 // print '<td'.($sellByCss ? ' class="'.$sellByCss.'"' : '').'>'.$langs->trans("SellByDate").'</td><td>';
229 print '<td>'.$langs->trans("SellByDate").'</td><td>';
230 $sellbyselected = dol_mktime(0, 0, 0, GETPOSTINT('sellbymonth'), GETPOSTINT('sellbyday'), GETPOSTINT('sellbyyear'));
231 // If form was opened for a specific pdluoid, field is disabled
232 print $form->selectDate(($pdluo->id > 0 ? $pdluo->sellby : $sellbyselected), 'sellby', 0, 0, 1, "", 1, 0, ($pdluoid > 0 ? 1 : 0));
233 print '</td>';
234 }
235 if (!getDolGlobalString('PRODUCT_DISABLE_EATBY')) {
236 // print '<td'.($eatByCss ? ' class="'.$eatByCss.'"' : '').'>'.$langs->trans("EatByDate").'</td><td>';
237 print '<td>'.$langs->trans("EatByDate").'</td><td>';
238 $eatbyselected = dol_mktime(0, 0, 0, GETPOSTINT('eatbymonth'), GETPOSTINT('eatbyday'), GETPOSTINT('eatbyyear'));
239 // If form was opened for a specific pdluoid, field is disabled
240 print $form->selectDate(($pdluo->id > 0 ? $pdluo->eatby : $eatbyselected), 'eatby', 0, 0, 1, "", 1, 0, ($pdluoid > 0 ? 1 : 0));
241 print '</td>';
242 }
243 print '</tr>';
244}
245
246// Purchase price and project
247print '<tr>';
248print '<td>'.$langs->trans("UnitPurchaseValue").'</td>';
249print '<td colspan="'.(isModEnabled('project') ? '1' : '3').'"><input name="unitprice" id="unitprice" size="10" value="'.GETPOST("unitprice").'"></td>';
250if (isModEnabled('project')) {
251 print '<td>'.$langs->trans('Project').'</td>';
252 print '<td>';
253 print img_picto('', 'project');
254 $formproject->select_projects(-1, '', 'projectid', 0, 0, 1, 0, 0, 0, 0, '', 0, 0, 'maxwidth300 widthcentpercentminusx');
255 print '</td>';
256}
257print '</tr>';
258
259// Label for movement of id of inventory
260$valformovementlabel = ((GETPOST("label") && (GETPOST('label') != $langs->trans("MovementCorrectStock", ''))) ? GETPOST("label") : $langs->trans("MovementCorrectStock", $productref));
261print '<tr>';
262print '<td>'.$langs->trans("MovementLabel").'</td>';
263print '<td>';
264print '<input type="text" name="label" class="minwidth400" value="'.dol_escape_htmltag($valformovementlabel).'">';
265print '</td>';
266print '<td>'.$langs->trans("InventoryCode").'</td>';
267print '<td>';
268print '<input class="maxwidth100onsmartphone" name="inventorycode" id="inventorycode" value="'.(GETPOSTISSET("inventorycode") ? GETPOST("inventorycode", 'alpha') : dol_print_date(dol_now(), '%Y%m%d%H%M%S')).'">';
269print '</td>';
270print '</tr>';
271
272print '</table>';
273
274print dol_get_fiche_end();
275
276print '<div class="center">';
277print '<input type="submit" class="button button-save" name="save" value="'.dol_escape_htmltag($langs->trans("Save")).'">';
278print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
279print '<input type="submit" class="button button-cancel" name="cancel" value="'.dol_escape_htmltag($langs->trans("Cancel")).'">';
280print '</div>';
281
282print '<br>';
283
284print '</form>';
285?>
286<!-- END PHP STOCKCORRECTION.TPL.PHP -->
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
Definition ajax.lib.php:476
Manage record for batch number management.
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $db
API class for accounts.
dol_now($mode='gmt')
Return date for now.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into JavaScript code.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php