40 print
"Error, template page can't be called as URL";
46if (isModEnabled(
'margin') && !empty(
$object->element) && in_array(
$object->element, array(
'facture',
'facturerec',
'propal',
'commande'))) {
50global $forceall, $senderissupplier, $inputalsopricewithtax, $canchangeproduct;
51if (empty($dateSelector)) {
54if (empty($forceall)) {
57if (empty($senderissupplier)) {
58 $senderissupplier = 0;
60if (empty($inputalsopricewithtax)) {
61 $inputalsopricewithtax = 0;
63if (empty($canchangeproduct)) {
64 $canchangeproduct = 0;
69if (!empty($inputalsopricewithtax)) {
72if (in_array(
$object->element, array(
'propal',
'supplier_proposal',
'facture',
'facturerec',
'invoice',
'commande',
'order',
'order_supplier',
'invoice_supplier',
'invoice_supplier_rec'))) {
75if (isModEnabled(
"multicurrency") &&
$object->multicurrency_code != $conf->currency) {
78if (isModEnabled(
'asset') &&
$object->element ==
'invoice_supplier') {
84print
"<!-- BEGIN PHP TEMPLATE objectline_edit.tpl.php -->\n";
88<tr
class=
"oddeven tredited">
90 <td
class=
"linecolnum center"><?php $coldisplay++; ?><?php echo($i + 1); ?></td>
95 <td
class=
"linecoldesc minwidth250onall">
96 <div
id=
"line_<?php echo $line->id; ?>"></div>
98 <input
type=
"hidden" name=
"lineid" value=
"<?php echo $line->id; ?>">
99 <input
type=
"hidden" id=
"product_type" name=
"type" value=
"<?php echo $line->product_type; ?>">
100 <input
type=
"hidden" id=
"special_code" name=
"special_code" value=
"<?php echo $line->special_code; ?>">
101 <input
type=
"hidden" id=
"fk_parent_line" name=
"fk_parent_line" value=
"<?php echo $line->fk_parent_line; ?>">
103 <?php
if ($line->fk_product > 0) { ?>
105 if (empty($canchangeproduct)) {
106 if ($line->fk_parent_line > 0) {
109 <a href=
"<?php echo DOL_URL_ROOT.'/product/card.php?id='.$line->fk_product; ?>">
111 if ($line->product_type == 1) {
112 echo
img_object($langs->trans(
'ShowService'),
'service');
114 print
img_object($langs->trans(
'ShowProduct'),
'product');
116 echo
' '.$line->ref; ?>
119 echo
' - '.nl2br($line->product_label);
120 print
'<input type="hidden" id="product_id" name="productid" value="'.(!empty($line->fk_product) ? $line->fk_product : 0).
'">';
122 if ($senderissupplier) {
123 $form->select_produits_fournisseurs(!empty($line->fk_product) ? $line->fk_product : 0,
'productid');
125 print $form->select_produits(!empty($line->fk_product) ? $line->fk_product : 0,
'productid');
133 if (is_object($hookmanager)) {
134 $fk_parent_line = (
GETPOST(
'fk_parent_line') ?
GETPOSTINT(
'fk_parent_line') : $line->fk_parent_line);
135 $parameters = array(
'line' => $line,
'fk_parent_line' => $fk_parent_line,
'var' => $var,
'dateSelector' => $dateSelector,
'seller' => $seller,
'buyer' => $buyer);
136 $reshook = $hookmanager->executeHooks(
'formEditProductOptions', $parameters, $this, $action);
139 $situationinvoicelinewithparent = 0;
140 if ($line->fk_prev_id !=
null && in_array(
$object->element, array(
'facture',
'facturedet'))) {
142 if (
$object->type == $object::TYPE_SITUATION) {
144 $situationinvoicelinewithparent = 1;
151 $situationinvoicelinewithparent = 0;
154 if (!$situationinvoicelinewithparent) {
156 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
161 $enable = (isset($conf->global->FCKEDITOR_ENABLE_DETAILS) ? $conf->global->FCKEDITOR_ENABLE_DETAILS : 0);
162 $toolbarname =
'dolibarr_details';
164 $toolbarname =
'dolibarr_notes';
166 $doleditor =
new DolEditor(
'product_desc', GETPOSTISSET(
'product_desc') ?
GETPOST(
'product_desc',
'restricthtml') : $line->
description,
'', (!
getDolGlobalString(
'MAIN_DOLEDITOR_HEIGHT') ? 164 : $conf->global->MAIN_DOLEDITOR_HEIGHT), $toolbarname,
'', false, true, $enable, $nbrows,
'98%');
167 $doleditor->Create();
169 print
'<textarea id="product_desc" class="flat" name="product_desc" readonly style="width: 200px; height:80px;">';
170 print GETPOSTISSET(
'product_desc') ?
GETPOST(
'product_desc',
'restricthtml') : $line->
description;
175 if (!empty($extrafields)) {
176 $temps = $line->showOptionals($extrafields,
'edit', array(
'class' =>
'tredited'),
'',
'', 1,
'line');
177 if (!empty($temps)) {
178 print
'<div style="padding-top: 10px" id="extrafield_lines_area_edit" name="extrafield_lines_area_edit">';
185 if (isModEnabled(
"service") && $line->product_type == 1 && ($line->element ==
'facturedetrec' || $line->element ==
'invoice_supplier_det_rec')) {
186 if ($line->element ==
'invoice_supplier_det_rec') {
187 $line->date_start_fill = $line->date_start;
188 $line->date_end_fill = $line->date_end;
191 echo $langs->trans(
'AutoFillDateFrom').
' ';
192 echo $form->selectyesno(
'date_start_fill', GETPOSTISSET(
'date_start_fill') ?
GETPOSTINT(
'date_start_fill') : $line->date_start_fill, 1);
194 echo $langs->trans(
'AutoFillDateTo').
' ';
195 echo $form->selectyesno(
'date_end_fill', GETPOSTISSET(
'date_end_fill') ?
GETPOSTINT(
'date_end_fill') : $line->date_end_fill, 1);
202 if (
$object->element ==
'supplier_proposal' ||
$object->element ==
'order_supplier' ||
$object->element ==
'invoice_supplier' ||
$object->element ==
'invoice_supplier_rec') {
204 <td
class=
"right linecolrefsupplier"><input
id=
"fourn_ref" name=
"fourn_ref" class=
"flat minwidth50 maxwidth100 maxwidth125onsmartphone" value=
"<?php echo GETPOSTISSET('fourn_ref') ? GETPOST('fourn_ref') : ($line->ref_supplier ? $line->ref_supplier : $line->ref_fourn); ?>"></td>
206 print
'<input type="hidden" id="fournprice" name="fournprice" class="" value="'.$line->fk_fournprice.
'">';
211 if (
$object->element ==
'propal' ||
$object->element ==
'commande' ||
$object->element ==
'facture' ||
$object->element ==
'facturerec') {
213 } elseif (
$object->element ==
'supplier_proposal' ||
$object->element ==
'order_supplier' ||
$object->element ==
'invoice_supplier' ||
$object->element ==
'invoice_supplier_rec') {
216 if (!$situationinvoicelinewithparent) {
217 print
'<td class="right">';
218 print $form->load_tva(
'tva_tx', GETPOSTISSET(
'tva_tx') ?
GETPOST(
'tva_tx',
'alpha') : ($line->tva_tx.($line->vat_src_code ? (
' ('.$line->vat_src_code.
')') :
'')), $seller, $buyer, 0, $line->info_bits, $line->product_type, false, 1, $type_tva);
221 print
'<td class="right"><input size="1" type="text" class="flat right" name="tva_tx" value="'.price($line->tva_tx).
'" readonly />%</td>';
225 print
'<td class="right"><input type="text" class="flat right width50" id="price_ht" name="price_ht" value="'.(GETPOSTISSET(
'price_ht') ?
GETPOST(
'price_ht',
'alpha') : (isset($line->pu_ht) ?
price($line->pu_ht, 0,
'', 0) :
price($line->subprice, 0,
'', 0))).
'"';
226 if ($situationinvoicelinewithparent) {
231 if (isModEnabled(
"multicurrency") &&
$object->multicurrency_code != $conf->currency) {
233 print
'<td class="right"><input rel="'.$object->multicurrency_tx.
'" type="text" class="flat right width50" id="multicurrency_subprice" name="multicurrency_subprice" value="'.(GETPOSTISSET(
'multicurrency_subprice') ?
GETPOST(
'multicurrency_subprice',
'alpha') :
price($line->multicurrency_subprice)).
'" /></td>';
236 if (!empty($inputalsopricewithtax) && !
getDolGlobalInt(
'MAIN_NO_INPUT_PRICE_WITH_TAX')) {
238 $upinctax = isset($line->pu_ttc) ? $line->pu_ttc :
null;
240 $upinctax =
price2num($line->total_ttc / (
float) $line->qty,
'MU');
242 print
'<td class="right"><input type="text" class="flat right width50" id="price_ttc" name="price_ttc" value="'.(GETPOSTISSET(
'price_ttc') ?
GETPOST(
'price_ttc') : (isset($upinctax) ?
price($upinctax, 0,
'', 0) :
'')).
'"';
243 if ($situationinvoicelinewithparent) {
251 if (($line->info_bits & 2) != 2) {
256 print
'<input size="3" type="text" class="flat right" name="qty" id="qty" value="'.(GETPOSTISSET(
'qty') ?
GETPOST(
'qty') : $line->qty).
'"';
257 if ($situationinvoicelinewithparent) {
270 if (!empty($line->fk_unit) && !
getDolGlobalString(
'MAIN_EDIT_LINE_ALLOW_ALL_UNIT_TYPE')) {
271 include_once DOL_DOCUMENT_ROOT.
'/core/class/cunits.class.php';
272 $cUnit =
new CUnits($line->db);
273 if ($cUnit->fetch($line->fk_unit) > 0) {
274 if (!empty($cUnit->unit_type)) {
275 $unit_type = $cUnit->unit_type;
280 print
'<td class="left">';
281 print $form->selectUnits(GETPOSTISSET(
'units') ?
GETPOST(
'units') : $line->fk_unit,
"units", 0, $unit_type);
286 <td
class=
"nowraponall right linecoldiscount">
290 if (($line->info_bits & 2) != 2) {
291 print
'<input type="text" class="flat right width40" name="remise_percent" id="remise_percent" value="'.(GETPOSTISSET(
'remise_percent') ?
GETPOST(
'remise_percent') : ($line->remise_percent ? $line->remise_percent :
'')).
'"';
292 if ($situationinvoicelinewithparent) {
295 print
'><span class="hideonsmartphone opacitymedium">%</span>';
303 if (
$object->situation_cycle_ref) {
306 $tmp_fieldv = (GETPOSTISSET(
'progress') ?
GETPOST(
'progress') : $line->situation_percent);
307 $old_fieldv = $line->get_allprev_progress($line->fk_facture);
308 $fieldv = $tmp_fieldv + $old_fieldv;
310 print
'<td class="nowrap right linecolcycleref"><input class="right" type="text" size="1" value="'.$fieldv.
'" name="progress">%</td>';
312 print
'<td class="nowrap right linecolcycleref"><input class="right" type="text" size="1" value="' . (GETPOSTISSET(
'progress') ?
GETPOST(
'progress') : $line->situation_percent) .
'" name="progress">%</td>';
318 if (!empty($usemargins)) {
319 if ($user->hasRight(
'margins',
'creer')) {
321 <td
class=
"margininfos right">
322 <!-- For predef product -->
323 <?php
if (isModEnabled(
"product") || isModEnabled(
"service")) { ?>
324 <select
id=
"fournprice_predef" name=
"fournprice_predef" class=
"flat minwidth75imp right" style=
"display: none;"></select>
326 <!-- For free product -->
327 <input
class=
"flat maxwidth75 right" type=
"text" id=
"buying_price" name=
"buying_price" class=
"hideobject" value=
"<?php echo(GETPOSTISSET('buying_price') ? GETPOST('buying_price') : price($line->pa_ht, 0, '', 0)); ?>">
332 if ($user->hasRight(
'margins',
'creer')) {
334 $margin_rate = (GETPOSTISSET(
"np_marginRate") ?
GETPOST(
"np_marginRate",
"alpha", 2) : (($line->pa_ht == 0) ?
'' :
price($line->marge_tx)));
336 if ($line->subprice < 0) {
337 echo
'<td class="right nowrap margininfos">'.$margin_rate.
'<span class="opacitymedium hideonsmartphone">%</span></td>';
339 echo
'<td class="right nowrap margininfos"><input class="right maxwidth40" type="text" name="np_marginRate" value="'.$margin_rate.
'"><span class="opacitymedium hideonsmartphone">%</span></td>';
344 $mark_rate = (GETPOSTISSET(
"np_markRate") ?
GETPOST(
"np_markRate",
'alpha', 2) :
price($line->marque_tx));
346 if ($line->subprice < 0) {
347 echo
'<td class="right nowrap margininfos">'.$mark_rate.
'<span class="opacitymedium hideonsmartphone">%</span></td>';
349 echo
'<td class="right nowrap margininfos"><input class="right maxwidth40" type="text" name="np_markRate" value="'.$mark_rate.
'"><span class="opacitymedium hideonsmartphone">%</span></td>';
357 <!-- colspan
for this td because it replace total_ht+3 td
for buttons+... -->
358 <td
class=
"center valignmiddle" colspan=
"<?php echo $colspan; ?>"><?php $coldisplay += $colspan; ?>
359 <input
type=
"submit" class=
"reposition button buttongen marginbottomonly button-save" id=
"savelinebutton marginbottomonly" name=
"save" value=
"<?php echo $langs->trans("Save
"); ?>"><br>
360 <input
type=
"submit" class=
"reposition button buttongen marginbottomonly button-cancel" id=
"cancellinebutton" name=
"cancel" value=
"<?php echo $langs->trans("Cancel
"); ?>">
364<?php
if (isModEnabled(
"service") && $line->product_type == 1 && $dateSelector) { ?>
365<tr
id=
"service_duration_area" class=
"treditedlinefordate">
367 <td
class=
"linecolnum center"></td>
369 <td colspan=
"<?php echo $coldisplay - (!getDolGlobalString('MAIN_VIEW_LINE_NUMBER') ? 0 : 1) ?>"><?php echo $langs->trans(
'ServiceLimitedDuration').
' '.$langs->trans(
'From').
' '; ?>
371 $prefillDates =
false;
373 for ($j = $i - 1; $j >= 0; $j--) {
374 $lastline =
$object->lines[$j];
375 if ($lastline->product_type ==
Product::TYPE_SERVICE && (!empty($lastline->date_start) || !empty($lastline->date_end))) {
376 $date_start_prefill = $lastline->date_start;
377 $date_end_prefill = $lastline->date_end;
378 $prefillDates =
true;
383 $hourmin = (isset($conf->global->MAIN_USE_HOURMIN_IN_DATE_RANGE) ? $conf->global->MAIN_USE_HOURMIN_IN_DATE_RANGE :
'');
384 print $form->selectDate($line->date_start,
'date_start', $hourmin, $hourmin, $line->date_start ? 0 : 1,
"updateline", 1, 0);
385 print
' '.$langs->trans(
'to').
' ';
386 print $form->selectDate($line->date_end,
'date_end', $hourmin, $hourmin, $line->date_end ? 0 : 1,
"updateline", 1, 0);
388 echo
' <span class="small"><a href="#" id="prefill_service_dates">'.$langs->trans(
'FillWithLastServiceDates').
'</a></span>';
394 function prefill_service_dates()
396 $(
'#date_start').val(
"<?php echo dol_escape_js(dol_print_date($date_start_prefill, 'day')); ?>").trigger(
'change');
397 $(
'#date_end').val(
"<?php echo dol_escape_js(dol_print_date($date_end_prefill, 'day')); ?>").trigger(
'change');
402 $(document).ready(
function()
404 $(
'#prefill_service_dates').click(prefill_service_dates);
409 if (!$line->date_start) {
410 if (isset($conf->global->MAIN_DEFAULT_DATE_START_HOUR)) {
411 print
'jQuery("#date_starthour").val("' .
getDolGlobalString(
'MAIN_DEFAULT_DATE_START_HOUR').
'");';
415 if (isset($conf->global->MAIN_DEFAULT_DATE_START_MIN)) {
416 print
'jQuery("#date_startmin").val("' .
getDolGlobalString(
'MAIN_DEFAULT_DATE_START_MIN').
'");';
420 if (!is_object($line->product)) {
421 $res = $line->fetch_product();
424 if ($line->product->isMandatoryPeriod() && $line->product->isService()) {
425 print
'jQuery("#date_start").addClass("inputmandatory");';
429 if (!$line->date_end) {
430 if (isset($conf->global->MAIN_DEFAULT_DATE_END_HOUR)) {
431 print
'jQuery("#date_endhour").val("' .
getDolGlobalString(
'MAIN_DEFAULT_DATE_END_HOUR').
'");';
433 if (isset($conf->global->MAIN_DEFAULT_DATE_END_MIN)) {
434 print
'jQuery("#date_endmin").val("' .
getDolGlobalString(
'MAIN_DEFAULT_DATE_END_MIN').
'");';
438 if (!is_object($line->product)) {
439 $res = $line->fetch_product();
442 if ($line->product->isMandatoryperiod() && $line->product->isService()) {
443 print
'jQuery("#date_end").addClass("inputmandatory");';
458if (!empty($usemargins) && $user->hasRight(
'margins',
'creer')) {
461 jQuery(document).ready(
function() {
465 $(
"input[name='np_marginRate']:first").blur(
function(e) {
466 return checkFreeLine(e,
"np_marginRate");
472 $(
"input[name='np_markRate']:first").blur(
function(e) {
473 return checkFreeLine(e,
"np_markRate");
480 function checkFreeLine(e, npRate)
482 var buying_price = $(
"input[name='buying_price']:first");
483 var remise = $(
"input[name='remise_percent']:first");
485 var rate = $(
"input[name='"+npRate+
"']:first");
486 if (rate.val() ==
'')
490 if (! $.isNumeric(ratejs))
492 alert(
'<?php echo dol_escape_js($langs->transnoentities("rateMustBeNumeric")); ?>');
494 setTimeout(
function () { rate.focus() }, 50);
497 if (npRate ==
"np_markRate" && rate.val() >= 100)
499 alert(
'<?php echo dol_escape_js($langs->transnoentities("markRateShouldBeLesserThan100")); ?>');
501 setTimeout(
function () { rate.focus() }, 50);
508 if (remisejs != 100) {
509 if (remisejs ==
'') {
516 if (npRate ==
"np_marginRate")
517 price = ((bpjs * (1 + ratejs / 100)) / (1 - remisejs / 100));
518 else if (npRate ==
"np_markRate")
519 price = ((bpjs / (1 - ratejs / 100)) / (1 - remisejs / 100));
521 $(
"input[name='price_ht']:first").val(
price);
529jQuery(document).ready(
function()
531 jQuery(
"#price_ht").keyup(
function(event) {
533 if (event.which != 9 && (event.which < 37 ||event.which > 40) && jQuery(
"#price_ht").val() !=
'') {
534 jQuery(
"#price_ttc").val(
'');
535 jQuery(
"#multicurrency_subprice").val(
'');
538 jQuery(
"#price_ttc").keyup(
function(event) {
540 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery(
"#price_ttc").val() !=
'') {
541 jQuery(
"#price_ht").val(
'');
542 jQuery(
"#multicurrency_subprice").val(
'');
545 jQuery(
"#multicurrency_subprice").keyup(
function(event) {
547 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery(
"#price_ttc").val() !=
'') {
548 jQuery(
"#price_ht").val(
'');
549 jQuery(
"#price_ttc").val(
'');
553 <?php
if (in_array(
$object->table_element_line, array(
'propaldet',
'commandedet',
'facturedet'))) { ?>
554 $(
"#date_start, #date_end").focusout(
function() {
555 if ( $(
this).val() ==
'' && !$(
this).hasClass(
'inputmandatory') ) {
556 $(
this).addClass(
'inputmandatory');
558 $(
this).removeClass(
'inputmandatory');
564 if (isModEnabled(
'margin')) {
567 jQuery(
"#tva_tx").click(
function() {
568 jQuery(
"input[name='np_marginRate']:first").val(
'');
569 jQuery(
"input[name='np_markRate']:first").val(
'');
571 jQuery(
"#tva_tx").keyup(
function() {
572 jQuery(
"input[name='np_marginRate']:first").val(
'');
573 jQuery(
"input[name='np_markRate']:first").val(
'');
575 jQuery(
"#price_ht").keyup(
function() {
576 jQuery(
"input[name='np_marginRate']:first").val(
'');
577 jQuery(
"input[name='np_markRate']:first").val(
'');
579 jQuery(
"#qty").keyup(
function() {
580 jQuery(
"input[name='np_marginRate']:first").val(
'');
581 jQuery(
"input[name='np_markRate']:first").val(
'');
583 jQuery(
"#remise_percent").keyup(
function() {
584 jQuery(
"input[name='np_marginRate']:first").val(
'');
585 jQuery(
"input[name='np_markRate']:first").val(
'');
587 jQuery(
"#buying_price").keyup(
function() {
588 jQuery(
"input[name='np_marginRate']:first").val(
'');
589 jQuery(
"input[name='np_markRate']:first").val(
'');
593 var token =
'<?php echo currentToken(); ?>';
594 $.post(
'<?php echo DOL_URL_ROOT; ?>/fourn/ajax/getSupplierPrices.php', {
'idprod': <?php echo $line->fk_product ? $line->fk_product : 0; ?>,
'token': token },
function(data) {
595 if (data && data.length > 0) {
598 $(data).each(
function() {
599 options +=
'<option value="'+this.
id+
'" price="'+this.price+
'"';
600 <?php
if ($line->fk_fournprice > 0) { ?>
601 if (this.id == <?php echo $line->fk_fournprice; ?>) {
602 options +=
' selected';
603 $(
"#buying_price").val(this.price);
607 options +=
'>'+this.label+
'</option>';
609 options +=
'<option value=null'+(trouve?
'':
' selected')+
'><?php echo $langs->trans("InputPrice"); ?></option>';
610 $(
"#fournprice").html(options);
612 $(
"#buying_price").hide();
613 $(
"#fournprice").show();
615 $(
"#buying_price").show();
617 $(
"#fournprice").change(
function() {
618 var selval = $(
this).find(
'option:selected').attr(
"price");
620 $(
"#buying_price").val(selval).hide();
622 $(
'#buying_price').show();
625 $(
"#fournprice").hide();
626 $(
'#buying_price').show();
635<!-- END PHP TEMPLATE objectline_edit.tpl.php -->
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Class of dictionary type of thirdparty (used by imports)
Class to manage a WYSIWYG editor.
const TYPE_SERVICE
Service.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
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.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
price2numjs(amount)
Function similar to PHP price2num()
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
$conf db name
Only used if Module[ID]Name translation string is not found.