dolibarr 21.0.0-beta
stockcorrection.tpl.php
1<?php
2/* Copyright (C) 2010-2017 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2018-2024 Frédéric France <frederic.france@free.fr>
4 * Copyright (C) 2024 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 STOCKCORRECTION.TPL.PHP -->
50<?php
51
52$productref = '';
53if ($object->element == 'product') {
55 $productref = $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();
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 $sellbyselected = dol_mktime(0, 0, 0, GETPOST('sellbymonth'), GETPOST('sellbyday'), GETPOST('sellbyyear'));
230 // If form was opened for a specific pdluoid, field is disabled
231 print $form->selectDate(($pdluo->id > 0 ? $pdluo->sellby : $sellbyselected), 'sellby', 0, 0, 1, "", 1, 0, ($pdluoid > 0 ? 1 : 0));
232 print '</td>';
233 }
234 if (!getDolGlobalString('PRODUCT_DISABLE_EATBY')) {
235 print '<td'.($eatByCss ? ' class="'.$eatByCss.'"' : '').'>'.$langs->trans("EatByDate").'</td><td>';
236 $eatbyselected = dol_mktime(0, 0, 0, GETPOST('eatbymonth'), GETPOST('eatbyday'), GETPOST('eatbyyear'));
237 // If form was opened for a specific pdluoid, field is disabled
238 print $form->selectDate(($pdluo->id > 0 ? $pdluo->eatby : $eatbyselected), 'eatby', 0, 0, 1, "", 1, 0, ($pdluoid > 0 ? 1 : 0));
239 print '</td>';
240 }
241 print '</tr>';
242}
243
244// Purchase price and project
245print '<tr>';
246print '<td>'.$langs->trans("UnitPurchaseValue").'</td>';
247print '<td colspan="'.(isModEnabled('project') ? '1' : '3').'"><input name="unitprice" id="unitprice" size="10" value="'.GETPOST("unitprice").'"></td>';
248if (isModEnabled('project')) {
249 print '<td>'.$langs->trans('Project').'</td>';
250 print '<td>';
251 print img_picto('', 'project');
252 $formproject->select_projects(-1, '', 'projectid', 0, 0, 1, 0, 0, 0, 0, '', 0, 0, 'maxwidth300 widthcentpercentminusx');
253 print '</td>';
254}
255print '</tr>';
256
257// Label for movement of id of inventory
258$valformovementlabel = ((GETPOST("label") && (GETPOST('label') != $langs->trans("MovementCorrectStock", ''))) ? GETPOST("label") : $langs->trans("MovementCorrectStock", $productref));
259print '<tr>';
260print '<td>'.$langs->trans("MovementLabel").'</td>';
261print '<td>';
262print '<input type="text" name="label" class="minwidth400" value="'.dol_escape_htmltag($valformovementlabel).'">';
263print '</td>';
264print '<td>'.$langs->trans("InventoryCode").'</td>';
265print '<td>';
266print '<input class="maxwidth100onsmartphone" name="inventorycode" id="inventorycode" value="'.(GETPOSTISSET("inventorycode") ? GETPOST("inventorycode", 'alpha') : dol_print_date(dol_now(), '%Y%m%d%H%M%S')).'">';
267print '</td>';
268print '</tr>';
269
270print '</table>';
271
272print dol_get_fiche_end();
273
274print '<div class="center">';
275print '<input type="submit" class="button button-save" name="save" value="'.dol_escape_htmltag($langs->trans("Save")).'">';
276print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
277print '<input type="submit" class="button button-cancel" name="cancel" value="'.dol_escape_htmltag($langs->trans("Cancel")).'">';
278print '</div>';
279
280print '</form>';
281?>
282<!-- END PHP STOCKCORRECTION.TPL.PHP -->
$id
Definition account.php:48
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:66
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:459
Manage record for batch number management.
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...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
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)
Show tabs of a record.
currentToken()
Return the value of token currently saved into session with name 'token'.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_now($mode='auto')
Return date for now.
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.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
Definition member.php:79