diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php
index 3a4a2249de7..1e3ea48ce6c 100644
--- a/htdocs/core/class/html.form.class.php
+++ b/htdocs/core/class/html.form.class.php
@@ -6773,8 +6773,6 @@ class Form
return $resultyesno;
}
-
-
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Return list of export templates
diff --git a/htdocs/core/class/html.formother.class.php b/htdocs/core/class/html.formother.class.php
index 3957e44daf5..546b57b4a5f 100644
--- a/htdocs/core/class/html.formother.class.php
+++ b/htdocs/core/class/html.formother.class.php
@@ -9,6 +9,7 @@
* Copyright (C) 2006 Marc Barilley/Ocebo
* Copyright (C) 2007 Franky Van Liedekerke
* Copyright (C) 2007 Patrick Raguin
+ * Copyright (C) 2019 Thibault FOUCART
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -1232,4 +1233,44 @@ class FormOther
dol_print_error($this->db);
}
}
+
+ /**
+ * Return an html string with a select combo box to choose yes or no
+ *
+ * @param string $htmlname Name of html select field
+ * @param string $value Pre-selected value
+ * @param int $option 0 return automatic/manual, 1 return 1/0
+ * @param bool $disabled true or false
+ * @param int $useempty 1=Add empty line
+ * @return string See option
+ */
+ public function selectAutoManual($htmlname, $value = '', $option = 0, $disabled = false, $useempty = 0)
+ {
+ global $langs;
+
+ $automatic="automatic"; $manual="manual";
+ if ($option)
+ {
+ $automatic="1";
+ $manual="0";
+ }
+
+ $disabled = ($disabled ? ' disabled' : '');
+
+ $resultautomanual = ''."\n";
+ return $resultautomanual;
+ }
}
diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php
index 80cd10afb54..22ee559f700 100644
--- a/htdocs/core/lib/functions.lib.php
+++ b/htdocs/core/lib/functions.lib.php
@@ -14,6 +14,7 @@
* Copyright (C) 2014-2015 Marcos García
* Copyright (C) 2015 Jean-François Ferry
* Copyright (C) 2018-2019 Frédéric France
+ * Copyright (C) 2019 Thibault Foucart
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -5211,6 +5212,40 @@ function yn($yesno, $case = 1, $color = 0)
return $result;
}
+/**
+ * Return automatic or manual in current language
+ *
+ * @param string $automaticmanual Value to test (1, 'automatic', 'true' or 0, 'manual', 'false')
+ * @param integer $case 1=Yes/No, 0=yes/no, 2=Disabled checkbox, 3=Disabled checkbox + Automatic/Manual
+ * @param int $color 0=texte only, 1=Text is formated with a color font style ('ok' or 'error'), 2=Text is formated with 'ok' color.
+ * @return string HTML string
+ */
+function am($automaticmanual, $case = 1, $color = 0)
+{
+ global $langs;
+ $result='unknown'; $classname='';
+ if ($automaticmanual == 1 || strtolower($automaticmanual) == 'automatic' || strtolower($automaticmanual) == 'true') // A mettre avant test sur no a cause du == 0
+ {
+ $result=$langs->trans('automatic');
+ if ($case == 1 || $case == 3) $result=$langs->trans("Automatic");
+ if ($case == 2) $result='';
+ if ($case == 3) $result=' '.$result;
+
+ $classname='ok';
+ }
+ elseif ($yesno == 0 || strtolower($automaticmanual) == 'manual' || strtolower($automaticmanual) == 'false')
+ {
+ $result=$langs->trans("manual");
+ if ($case == 1 || $case == 3) $result=$langs->trans("Manual");
+ if ($case == 2) $result='';
+ if ($case == 3) $result=' '.$result;
+
+ if ($color == 2) $classname='ok';
+ else $classname='error';
+ }
+ if ($color) return ''.$result.'';
+ return $result;
+}
/**
* Return a path to have a the directory according to object where files are stored.
diff --git a/htdocs/takepos/invoice.php b/htdocs/takepos/invoice.php
index a4fd8cb508c..46df42c4c52 100644
--- a/htdocs/takepos/invoice.php
+++ b/htdocs/takepos/invoice.php
@@ -41,10 +41,25 @@ $langs->loadLangs(array("bills", "cashdesk"));
$id = GETPOST('id', 'int');
$action = GETPOST('action', 'alpha');
$idproduct = GETPOST('idproduct', 'int');
-
$place = (GETPOST('place', 'int') > 0 ? GETPOST('place', 'int') : 0); // $place is id of table for Ba or Restaurant
$posnb = (GETPOST('posnb', 'int') > 0 ? GETPOST('posnb', 'int') : 0); // $posnb is id of POS
+/**
+ * Abort invoice creationg with a given error message
+ *
+ * @param string $message Message explaining the error to the user
+ * @return void
+ */
+function fail($message)
+{
+ header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500);
+ die($message);
+}
+
+
+
+$placeid = 0; // $placeid is id of invoice
+
$number = GETPOST('number', 'alpha');
$idline = GETPOST('idline', 'int');
$desc = GETPOST('desc', 'alpha');
@@ -100,6 +115,26 @@ if ($action == 'valid' && $user->rights->facture->creer)
$invoice = new Facture($db);
$invoice->fetch($placeid);
+ if($invoice->total_ttc<0){
+ $invoice->type= $invoice::TYPE_CREDIT_NOTE;
+ $sql="SELECT rowid FROM ".MAIN_DB_PREFIX."facture WHERE ";
+ $sql.="fk_soc = '".$invoice->socid."' ";
+ $sql.="AND type <> ".Facture::TYPE_CREDIT_NOTE." ";
+ $sql.="AND fk_statut >= ".$invoice::STATUS_VALIDATED." ";
+ $sql.="ORDER BY rowid DESC";
+ $resql = $db->query($sql);
+ if($resql){
+ $obj = $db->fetch_object($resql);
+ $fk_source=$obj->rowid;
+ if($fk_source == null){
+ fail($langs->transnoentitiesnoconv("NoPreviousBillForCustomer"));
+ }
+ }else{
+ fail($langs->transnoentitiesnoconv("NoPreviousBillForCustomer"));
+ }
+ $invoice->fk_facture_source=$fk_source;
+ $invoice->update($user);
+ }
if (! empty($conf->stock->enabled) && $conf->global->CASHDESK_NO_DECREASE_STOCK != "1")
{