diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php
index cef54968cb7..26e65e09464 100644
--- a/htdocs/comm/propal/class/propal.class.php
+++ b/htdocs/comm/propal/class/propal.class.php
@@ -789,6 +789,7 @@ class Propal extends CommonObject
if (empty($this->availability_id)) $this->availability_id=0;
if (empty($this->demand_reason_id)) $this->demand_reason_id=0;
+ // Multicurrency
if (!empty($this->multicurrency_code)) list($this->fk_multicurrency,$this->multicurrency_tx) = MultiCurrency::getIdAndTxFromCode($this->db, $this->multicurrency_code);
if (empty($this->fk_multicurrency))
{
diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php
index 9e7f5fae4f8..a362680b840 100644
--- a/htdocs/commande/card.php
+++ b/htdocs/commande/card.php
@@ -260,7 +260,9 @@ if (empty($reshook))
$object->contactid = GETPOST('contactid');
$object->fk_incoterms = GETPOST('incoterm_id', 'int');
$object->location_incoterms = GETPOST('location_incoterms', 'alpha');
-
+ $object->multicurrency_code = GETPOST('multicurrency_code', 'alpha');
+ $object->multicurrency_tx = GETPOST('originmulticurrency_tx', 'int');
+
// If creation from another object of another module (Example: origin=propal, originid=1)
if (! empty($origin) && ! empty($originid))
{
@@ -490,7 +492,17 @@ if (empty($reshook))
if ($result < 0)
dol_print_error($db, $object->error);
}
+
+ // Multicurrency Code
+ else if ($action == 'setmulticurrencycode' && $user->rights->commande->creer) {
+ $result = $object->setMulticurrencyCode(GETPOST('multicurrency_code', 'alpha'));
+ }
+ // Multicurrency rate
+ else if ($action == 'setmulticurrencyrate' && $user->rights->commande->creer) {
+ $result = $object->setMulticurrencyRate(GETPOST('multicurrency_tx', 'int'));
+ }
+
else if ($action == 'setavailability' && $user->rights->commande->creer) {
$result = $object->availability(GETPOST('availability_id'));
if ($result < 0)
@@ -1260,7 +1272,8 @@ if ($action == 'create' && $user->rights->commande->creer)
$projectid = 0;
$remise_absolue = 0;
-
+ $currency_code = $conf->currency;
+
if (! empty($origin) && ! empty($originid)) {
// Parse element/subelement (ex: project_task)
$element = $subelement = $origin;
@@ -1328,6 +1341,12 @@ if ($action == 'create' && $user->rights->commande->creer)
$datedelivery = (! empty($objectsrc->date_livraison) ? $objectsrc->date_livraison : '');
+ if (!empty($conf->multicurrency->enabled))
+ {
+ if (!empty($objectsrc->multicurrency_code)) $currency_code = $objectsrc->multicurrency_code;
+ if (!empty($conf->global->MULTICURRENCY_USE_ORIGIN_TX) && !empty($objectsrc->multicurrency_tx)) $currency_tx = $objectsrc->multicurrency_tx;
+ }
+
$note_private = $object->getDefaultCreateValueFor('note_private', (! empty($objectsrc->note_private) ? $objectsrc->note_private : null));
$note_public = $object->getDefaultCreateValueFor('note_public', (! empty($objectsrc->note_public) ? $objectsrc->note_public : null));
@@ -1348,6 +1367,8 @@ if ($action == 'create' && $user->rights->commande->creer)
$remise_absolue = 0;
$dateorder = empty($conf->global->MAIN_AUTOFILL_DATE_ORDER)?-1:'';
$projectid = 0;
+
+ if (!empty($conf->multicurrency->enabled) && !empty($soc->multicurrency_code)) $currency_code = $soc->multicurrency_code;
$note_private = $object->getDefaultCreateValueFor('note_private');
$note_public = $object->getDefaultCreateValueFor('note_public');
@@ -1363,6 +1384,7 @@ if ($action == 'create' && $user->rights->commande->creer)
print '';
print '';
print '';
+ if (!empty($currency_tx)) print '';
dol_fiche_head('');
@@ -1532,6 +1554,16 @@ if ($action == 'create' && $user->rights->commande->creer)
print $form->selectarray('model', $liste, $conf->global->COMMANDE_ADDON_PDF);
print "";
+ // Multicurrency
+ if (! empty($conf->multicurrency->enabled))
+ {
+ print '
';
+ print '| '.fieldLabel('Currency','multicurrency_code').' | ';
+ print '';
+ print $form->selectMultiCurrency($currency_code, 'multicurrency_code');
+ print ' |
';
+ }
+
// Note public
print '';
print '| ' . $langs->trans('NotePublic') . ' | ';
@@ -1603,6 +1635,13 @@ if ($action == 'create' && $user->rights->commande->creer)
}
print '
| ' . $langs->trans('TotalTTC') . ' | ' . price($objectsrc->total_ttc) . " |
";
+
+ if (!empty($conf->multicurrency->enabled))
+ {
+ print '| ' . $langs->trans('MulticurrencyTotalHT') . ' | ' . price($objectsrc->multicurrency_total_ht) . ' |
';
+ print '| ' . $langs->trans('MulticurrencyTotalVAT') . ' | ' . price($objectsrc->multicurrency_total_tva) . " |
";
+ print '| ' . $langs->trans('MulticurrencyTotalTTC') . ' | ' . price($objectsrc->multicurrency_total_ttc) . " |
";
+ }
}
else
{
@@ -2145,6 +2184,43 @@ if ($action == 'create' && $user->rights->commande->creer)
print '';
}
+ // Multicurrency
+ if (! empty($conf->multicurrency->enabled))
+ {
+ // Multicurrency code
+ print '';
+ print '| ';
+ print '';
+ print ' | ';
+ if ($action == 'editmulticurrencycode') {
+ $form->form_multicurrency_code($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_code, 'multicurrency_code');
+ } else {
+ $form->form_multicurrency_code($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_code, 'none');
+ }
+ print ' |
';
+
+ // Multicurrency rate
+ print '';
+ print '| ';
+ print '';
+ print ' | ';
+ if ($action == 'editmulticurrencyrate') {
+ $form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'multicurrency_tx');
+ } else {
+ $form->form_multicurrency_rate($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->multicurrency_tx, 'none');
+ }
+ print ' |
';
+ }
// Other attributes
$cols = 3;
include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php';
@@ -2207,6 +2283,24 @@ if ($action == 'create' && $user->rights->commande->creer)
// Total TTC
print '| ' . $langs->trans('AmountTTC') . ' | ' . price($object->total_ttc, 1, '', 1, - 1, - 1, $conf->currency) . ' |
';
+ if (!empty($conf->multicurrency->enabled))
+ {
+ // Multicurrency Amount HT
+ print '| ' . fieldLabel('MulticurrencyAmountHT','multicurrency_total_ht') . ' | ';
+ print '' . price($object->multicurrency_total_ht, '', $langs, 0, - 1, - 1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)) . ' | ';
+ print '
';
+
+ // Multicurrency Amount VAT
+ print '| ' . fieldLabel('MulticurrencyAmountVAT','multicurrency_total_tva') . ' | ';
+ print '' . price($object->multicurrency_total_tva, '', $langs, 0, - 1, - 1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)) . ' | ';
+ print '
';
+
+ // Multicurrency Amount TTC
+ print '| ' . fieldLabel('MulticurrencyAmountTTC','multicurrency_total_ttc') . ' | ';
+ print '' . price($object->multicurrency_total_ttc, '', $langs, 0, - 1, - 1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)) . ' | ';
+ print '
';
+ }
+
// Statut
print '| ' . $langs->trans('Status') . ' | ' . $object->getLibStatut(4) . ' |
';
diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php
index b1e4651eace..080db4aa64f 100644
--- a/htdocs/commande/class/commande.class.php
+++ b/htdocs/commande/class/commande.class.php
@@ -33,6 +33,7 @@ include_once DOL_DOCUMENT_ROOT.'/core/class/commonorder.class.php';
require_once DOL_DOCUMENT_ROOT ."/core/class/commonobjectline.class.php";
require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
require_once DOL_DOCUMENT_ROOT .'/margin/lib/margins.lib.php';
+dol_include_once('/multicurrency/class/multicurrency.class.php');
/**
* Class to manage customers orders
@@ -143,6 +144,14 @@ class Commande extends CommonOrder
var $nbtodo;
var $nbtodolate;
+ // Multicurrency
+ var $fk_multicurrency;
+ var $multicurrency_code;
+ var $multicurrency_tx;
+ var $multicurrency_total_ht;
+ var $multicurrency_total_tva;
+ var $multicurrency_total_ttc;
+
/**
* ERR Not enough stock
*/
@@ -692,7 +701,17 @@ class Commande extends CommonOrder
// Clean parameters
$this->brouillon = 1; // set command as draft
-
+
+ // Multicurrency (test on $this->multicurrency_tx because we sould take the default rate only if not using origin rate)
+ if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) list($this->fk_multicurrency,$this->multicurrency_tx) = MultiCurrency::getIdAndTxFromCode($this->db, $this->multicurrency_code);
+ else $this->fk_multicurrency = MultiCurrency::getIdFromCode($this->db, $this->multicurrency_code);
+ if (empty($this->fk_multicurrency))
+ {
+ $this->multicurrency_code = $conf->currency;
+ $this->fk_multicurrency = 0;
+ $this->multicurrency_tx = 1;
+ }
+
dol_syslog(get_class($this)."::create user=".$user->id);
// Check parameters
@@ -738,6 +757,9 @@ class Commande extends CommonOrder
$sql.= ", remise_absolue, remise_percent";
$sql.= ", fk_incoterms, location_incoterms";
$sql.= ", entity";
+ $sql.= ", fk_multicurrency";
+ $sql.= ", multicurrency_code";
+ $sql.= ", multicurrency_tx";
$sql.= ")";
$sql.= " VALUES ('(PROV)',".$this->socid.", '".$this->db->idate($now)."', ".$user->id;
$sql.= ", ".($this->fk_project>0?$this->fk_project:"null");
@@ -763,6 +785,9 @@ class Commande extends CommonOrder
$sql.= ", ".(int) $this->fk_incoterms;
$sql.= ", '".$this->db->escape($this->location_incoterms)."'";
$sql.= ", ".$conf->entity;
+ $sql.= ", ".(int) $this->fk_multicurrency;
+ $sql.= ", '".$this->db->escape($this->multicurrency_code)."'";
+ $sql.= ", ".(double) $this->multicurrency_tx;
$sql.= ")";
dol_syslog(get_class($this)."::create", LOG_DEBUG);
@@ -1254,13 +1279,18 @@ class Commande extends CommonOrder
$localtaxes_type=getLocalTaxesFromRate($txtva,0,$this->thirdparty,$mysoc);
$txtva = preg_replace('/\s*\(.*\)/','',$txtva); // Remove code into vatrate.
- $tabprice = calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $product_type, $mysoc, $localtaxes_type);
+ $tabprice = calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $product_type, $mysoc, $localtaxes_type, 100, $this->multicurrency_tx);
$total_ht = $tabprice[0];
$total_tva = $tabprice[1];
$total_ttc = $tabprice[2];
$total_localtax1 = $tabprice[9];
$total_localtax2 = $tabprice[10];
+ // MultiCurrency
+ $multicurrency_total_ht = $tabprice[16];
+ $multicurrency_total_tva = $tabprice[17];
+ $multicurrency_total_ttc = $tabprice[18];
+
// Rang to use
$rangtouse = $rang;
if ($rangtouse == -1)
@@ -1318,6 +1348,14 @@ class Commande extends CommonOrder
$this->line->fk_fournprice = $fk_fournprice;
$this->line->pa_ht = $pa_ht;
+ // Multicurrency
+ $this->line->fk_multicurrency = $this->fk_multicurrency;
+ $this->line->multicurrency_code = $this->multicurrency_code;
+ $this->line->multicurrency_subprice = price2num($pu_ht * $this->multicurrency_tx);
+ $this->line->multicurrency_total_ht = $multicurrency_total_ht;
+ $this->line->multicurrency_total_tva = $multicurrency_total_tva;
+ $this->line->multicurrency_total_ttc = $multicurrency_total_ttc;
+
// TODO Ne plus utiliser
$this->line->price=$price;
$this->line->remise=$remise;
@@ -1464,6 +1502,7 @@ class Commande extends CommonOrder
$sql.= ', c.fk_projet, c.remise_percent, c.remise, c.remise_absolue, c.source, c.facture as billed';
$sql.= ', c.note_private, c.note_public, c.ref_client, c.ref_ext, c.ref_int, c.model_pdf, c.fk_delivery_address, c.extraparams';
$sql.= ', c.fk_incoterms, c.location_incoterms';
+ $sql.= ", c.fk_multicurrency, c.multicurrency_code, c.multicurrency_tx, c.multicurrency_total_ht, c.multicurrency_total_tva, c.multicurrency_total_ttc";
$sql.= ", i.libelle as libelle_incoterms";
$sql.= ', p.code as mode_reglement_code, p.libelle as mode_reglement_libelle';
$sql.= ', cr.code as cond_reglement_code, cr.libelle as cond_reglement_libelle, cr.libelle_facture as cond_reglement_libelle_doc';
@@ -1537,6 +1576,14 @@ class Commande extends CommonOrder
$this->location_incoterms = $obj->location_incoterms;
$this->libelle_incoterms = $obj->libelle_incoterms;
+ // Multicurrency
+ $this->fk_multicurrency = $obj->fk_multicurrency;
+ $this->multicurrency_code = $obj->multicurrency_code;
+ $this->multicurrency_tx = $obj->multicurrency_tx;
+ $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
+ $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
+ $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
+
$this->extraparams = (array) json_decode($obj->extraparams, true);
$this->lines = array();
@@ -1666,6 +1713,7 @@ class Commande extends CommonOrder
$sql.= ' l.localtax1_tx, l.localtax2_tx, l.fk_remise_except, l.remise_percent, l.subprice, l.fk_product_fournisseur_price as fk_fournprice, l.buy_price_ht as pa_ht, l.rang, l.info_bits, l.special_code,';
$sql.= ' l.total_ht, l.total_ttc, l.total_tva, l.total_localtax1, l.total_localtax2, l.date_start, l.date_end,';
$sql.= ' l.fk_unit,';
+ $sql.= ' l.fk_multicurrency, l.multicurrency_code, l.multicurrency_subprice, l.multicurrency_total_ht, l.multicurrency_total_tva, l.multicurrency_total_ttc,';
$sql.= ' p.ref as product_ref, p.description as product_desc, p.fk_product_type, p.label as product_label';
$sql.= ' FROM '.MAIN_DB_PREFIX.'commandedet as l';
$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'product as p ON (p.rowid = l.fk_product)';
@@ -1728,6 +1776,14 @@ class Commande extends CommonOrder
$line->date_start = $this->db->jdate($objp->date_start);
$line->date_end = $this->db->jdate($objp->date_end);
+ // Multicurrency
+ $line->fk_multicurrency = $objp->fk_multicurrency;
+ $line->multicurrency_code = $objp->multicurrency_code;
+ $line->multicurrency_subprice = $objp->multicurrency_subprice;
+ $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
+ $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
+ $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
+
$this->lines[$i] = $line;
$i++;
@@ -2478,13 +2534,18 @@ class Commande extends CommonOrder
$localtaxes_type=getLocalTaxesFromRate($txtva,0,$this->thirdparty, $mysoc);
$txtva = preg_replace('/\s*\(.*\)/','',$txtva); // Remove code into vatrate.
- $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $mysoc, $localtaxes_type);
+ $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $mysoc, $localtaxes_type, 100, $this->multicurrency_tx);
$total_ht = $tabprice[0];
$total_tva = $tabprice[1];
$total_ttc = $tabprice[2];
$total_localtax1 = $tabprice[9];
$total_localtax2 = $tabprice[10];
+ // MultiCurrency
+ $multicurrency_total_ht = $tabprice[16];
+ $multicurrency_total_tva = $tabprice[17];
+ $multicurrency_total_ttc = $tabprice[18];
+
// Anciens indicateurs: $price, $subprice, $remise (a ne plus utiliser)
$price = $pu;
$subprice = $pu;
@@ -2540,6 +2601,12 @@ class Commande extends CommonOrder
$this->line->fk_fournprice = $fk_fournprice;
$this->line->pa_ht = $pa_ht;
+ // Multicurrency
+ $this->line->multicurrency_subprice = price2num($subprice * $this->multicurrency_tx);
+ $this->line->multicurrency_total_ht = $multicurrency_total_ht;
+ $this->line->multicurrency_total_tva = $multicurrency_total_tva;
+ $this->line->multicurrency_total_ttc = $multicurrency_total_ttc;
+
// TODO deprecated
$this->line->price=$price;
$this->line->remise=$remise;
@@ -3222,6 +3289,7 @@ class Commande extends CommonOrder
$sql.= ' l.total_ht, l.total_tva, l.total_ttc, l.fk_product_fournisseur_price as fk_fournprice, l.buy_price_ht as pa_ht, l.localtax1_tx, l.localtax2_tx,';
$sql.= ' l.date_start, l.date_end,';
$sql.= ' l.fk_unit,';
+ $sql.= ' l.fk_multicurrency, l.multicurrency_code, l.multicurrency_subprice, l.multicurrency_total_ht, l.multicurrency_total_tva, l.multicurrency_total_ttc';
$sql.= ' p.label as product_label, p.ref, p.fk_product_type, p.rowid as prodid, ';
$sql.= ' p.description as product_desc, p.stock as stock_reel,';
$sql.= ' p.entity';
@@ -3272,7 +3340,15 @@ class Commande extends CommonOrder
$this->lines[$i]->marge_tx = $marginInfos[1];
$this->lines[$i]->marque_tx = $marginInfos[2];
$this->lines[$i]->fk_unit = $obj->fk_unit;
-
+
+ // Multicurrency
+ $line->fk_multicurrency = $obj->fk_multicurrency;
+ $line->multicurrency_code = $obj->multicurrency_code;
+ $line->multicurrency_subprice = $obj->multicurrency_subprice;
+ $line->multicurrency_total_ht = $obj->multicurrency_total_ht;
+ $line->multicurrency_total_tva = $obj->multicurrency_total_tva;
+ $line->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
+
$i++;
}
@@ -3608,7 +3684,9 @@ class OrderLine extends CommonOrderLine
$sql.= ' fk_product, product_type, remise_percent, subprice, price, remise, fk_remise_except,';
$sql.= ' special_code, rang, fk_product_fournisseur_price, buy_price_ht,';
$sql.= ' info_bits, total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, date_start, date_end,';
- $sql.= ' fk_unit)';
+ $sql.= ' fk_unit';
+ $sql.= ', fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc';
+ $sql.= ')';
$sql.= " VALUES (".$this->fk_commande.",";
$sql.= " ".($this->fk_parent_line>0?"'".$this->fk_parent_line."'":"null").",";
$sql.= " ".(! empty($this->label)?"'".$this->db->escape($this->label)."'":"null").",";
@@ -3639,6 +3717,12 @@ class OrderLine extends CommonOrderLine
$sql.= " ".(! empty($this->date_start)?"'".$this->db->idate($this->date_start)."'":"null").',';
$sql.= " ".(! empty($this->date_end)?"'".$this->db->idate($this->date_end)."'":"null").',';
$sql.= ' '.(!$this->fk_unit ? 'NULL' : $this->fk_unit);
+ $sql.= ", ".$this->fk_multicurrency;
+ $sql.= ", '".$this->db->escape($this->multicurrency_code)."'";
+ $sql.= ", ".$this->multicurrency_subprice;
+ $sql.= ", ".$this->multicurrency_total_ht;
+ $sql.= ", ".$this->multicurrency_total_tva;
+ $sql.= ", ".$this->multicurrency_total_ttc;
$sql.= ')';
dol_syslog(get_class($this)."::insert", LOG_DEBUG);
diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php
index 60897072432..baa4fa8f8bb 100644
--- a/htdocs/core/class/commonobject.class.php
+++ b/htdocs/core/class/commonobject.class.php
@@ -3382,6 +3382,7 @@ abstract class CommonObject
print ''.$langs->trans('Description').' | ';
print ''.$langs->trans('VAT').' | ';
print ''.$langs->trans('PriceUHT').' | ';
+ if (!empty($conf->multicurrency->enabled)) print ''.$langs->trans('PriceUHTCurrency').' | ';
print ''.$langs->trans('Qty').' | ';
if($conf->global->PRODUCT_USE_UNITS)
{
@@ -3512,6 +3513,7 @@ abstract class CommonObject
$this->tpl['vat_rate'] = vatrate($line->tva_tx, true);
$this->tpl['price'] = price($line->subprice);
+ $this->tpl['multicurrency_price'] = price($line->multicurrency_subprice);
$this->tpl['qty'] = (($line->info_bits & 2) != 2) ? $line->qty : ' ';
if($conf->global->PRODUCT_USE_UNITS) $this->tpl['unit'] = $line->getLabelOfUnit('long');
$this->tpl['remise_percent'] = (($line->info_bits & 2) != 2) ? vatrate($line->remise_percent, true) : ' ';
diff --git a/htdocs/core/tpl/originproductline.tpl.php b/htdocs/core/tpl/originproductline.tpl.php
index 7919668ae53..78006316f63 100644
--- a/htdocs/core/tpl/originproductline.tpl.php
+++ b/htdocs/core/tpl/originproductline.tpl.php
@@ -23,6 +23,7 @@
tpl['description']; ?> |
tpl['vat_rate']; ?> |
tpl['price']; ?> |
+ multicurrency->enabled)) { ?>tpl['multicurrency_price']; ?> |
tpl['qty']; ?> |
global->PRODUCT_USE_UNITS) echo ''.$langs->trans($this->tpl['unit']).' | ';