Commit 4df49940 authored by philippe's avatar philippe
Browse files

Providers improvement. Still one bug in product_edit : select field won’t set...

Providers improvement. Still one bug in product_edit : select field won’t set on the provider defined in categories
parent 2f175723
......@@ -53,7 +53,7 @@ class ProductsAPI extends APIService {
case 'getCategory':
$this->succeed(ProductsService::getByCategory($this->params['id']));
break;
}
}
}
}
......
......@@ -26,8 +26,6 @@ class ProvidersAPI extends APIService {
switch ($this->action) {
case 'get':
return isset($this->params['id']);
case 'getChildren':
return isset($this->params['parentId']);
case 'getAll':
return true;
}
......@@ -39,9 +37,6 @@ class ProvidersAPI extends APIService {
case 'get':
$this->succeed(ProvidersService::get($this->params['id']));
break;
case 'getChildren':
$this->succeed(ProvidersService::getChildren($this->params['parentId']));
break;
case 'getAll':
$this->succeed(ProvidersService::getAll());
break;
......
......@@ -31,6 +31,7 @@ class Product {
public $visible;
public $scaled;
public $categoryId;
public $providerId;
public $dispOrder;
public $taxCatId;
public $attributeSetId;
......@@ -38,11 +39,12 @@ class Product {
public $discountEnabled;
public $discountRate;
static function __build($id, $ref, $label, $priceSell, $category,
static function __build($id, $ref, $label, $priceSell, $categoryId, $providerId,
$dispOrder, $taxCatId, $visible, $scaled, $priceBuy = null,
$attributeSetId = null, $barcode = null, $hasImage = false,
$discountEnabled = false, $discountRate = 0.0) {
$prd = new Product($ref, $label, $priceSell, $category, $dispOrder,
$prd = new Product($ref, $label, $priceSell, $categoryId, $providerId,
$dispOrder,
$taxCatId, $visible, $scaled, $priceBuy,
$attributeSetId, $barcode, $hasImage,
$discountEnabled, $discountRate);
......@@ -50,7 +52,7 @@ class Product {
return $prd;
}
function __construct($ref, $label, $priceSell, $categoryId, $dispOrder,
function __construct($ref, $label, $priceSell, $categoryId, $providerId, $dispOrder,
$taxCatId, $visible, $scaled, $priceBuy = null,
$attributeSetId = null, $barcode = null, $hasImage = false,
$discountEnabled = false, $discountRate = 0.0) {
......@@ -62,6 +64,7 @@ class Product {
$this->barcode = $barcode;
$this->priceBuy = $priceBuy;
$this->categoryId = $categoryId;
$this->providerId = $providerId;
$this->dispOrder = $dispOrder;
$this->taxCatId = $taxCatId;
$this->attributeSetId = $attributeSetId;
......@@ -89,4 +92,4 @@ class Product {
}
}
?>
\ No newline at end of file
?>
......@@ -39,18 +39,18 @@ class Provider {
public $city;
public $region;
public $country;
public $note;
public $notes;
public $visible;
public $dispOrder;
static function __build($id, $label, $hasImage,
$firstName, $lastName, $email, $phone1, $phone2, $website,
$fax, $addr1, $addr2, $zipCode, $city, $region, $country,
$note, $visible, $order) {
$notes, $visible, $order) {
$prov = new Provider($label, $hasImage,
$firstName, $lastName, $email, $phone1, $phone2, $website,
$fax, $addr1, $addr2, $zipCode, $city, $region, $country,
$note, $visible, $order);
$notes, $visible, $order);
$prov->id = $id;
return $prov;
}
......@@ -58,7 +58,7 @@ class Provider {
function __construct($label, $hasImage,
$firstName, $lastName, $email, $phone1, $phone2, $website,
$fax, $addr1, $addr2, $zipCode, $city, $region, $country,
$note, $visible, $order) {
$notes, $visible, $order) {
$this->label = $label;
$this->hasImage = (bool) $hasImage;
$this->firstName = $firstName;
......@@ -74,7 +74,7 @@ class Provider {
$this->city = $city;
$this->region = $region;
$this->country = $country;
$this->note = $note;
$this->notes = $notes;
$this->visible = $visible;
$this->dispOrder = (int) $order;
}
......
......@@ -34,6 +34,7 @@ class ProductsService {
}
return Product::__build($dpPrd['ID'], $dpPrd['REFERENCE'],
$dpPrd['NAME'], $dpPrd['PRICESELL'], $dpPrd['CATEGORY'],
$dbPrd['PROVIDER'],
$dispOrder, $dpPrd['TAXCAT'], $visible,
$db->readBool($dpPrd['ISSCALE']), $dpPrd['PRICEBUY'],
$dpPrd['ATTRIBUTESET_ID'], $dpPrd['CODE'],
......@@ -164,7 +165,7 @@ class ProductsService {
}
$sql = "UPDATE PRODUCTS SET REFERENCE = :ref, CODE = :code, "
. "NAME = :name, PRICEBUY = :buy, PRICESELL = :sell, "
. "CATEGORY = :cat, TAXCAT = :tax, ATTRIBUTESET_ID = :attr, "
. "CATEGORY = :cat, PROVIDER = :prov, TAXCAT = :tax, ATTRIBUTESET_ID = :attr, "
. "ISSCALE = :scale, DISCOUNTENABLED = :discountEnabled, "
. "DISCOUNTRATE = :discountRate";
if ($image !== "") {
......@@ -182,6 +183,7 @@ class ProductsService {
}
$stmt->bindParam(":sell", $prd->priceSell, \PDO::PARAM_STR);
$stmt->bindParam(":cat", $prd->categoryId, \PDO::PARAM_INT);
$stmt->bindParam(":prov", $prd->providerId, \PDO::PARAM_INT);
$stmt->bindParam(":tax", $prd->taxCatId, \PDO::PARAM_INT);
$stmt->bindParam(":attr", $prd->attributeSetId, \PDO::PARAM_INT);
$stmt->bindParam(":scale", $db->boolVal($prd->scaled));
......@@ -225,9 +227,9 @@ class ProductsService {
$code = $prd->barcode;
}
$sql = "INSERT INTO PRODUCTS (ID, REFERENCE, CODE, NAME, "
. "PRICEBUY, PRICESELL, CATEGORY, TAXCAT, "
. "PRICEBUY, PRICESELL, CATEGORY, PROVIDER, TAXCAT, "
. "ATTRIBUTESET_ID, ISSCALE, DISCOUNTENABLED, DISCOUNTRATE, "
. "IMAGE) VALUES (:id, :ref, :code, :name, :buy, :sell, :cat, "
. "IMAGE) VALUES (:id, :ref, :code, :name, :buy, :sell, :cat, :prov, "
. ":tax, :attr, :scale, :discEnabled, :discRate, :img)";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(":ref", $prd->reference, \PDO::PARAM_STR);
......@@ -240,6 +242,7 @@ class ProductsService {
}
$stmt->bindParam(":sell", $prd->priceSell, \PDO::PARAM_STR);
$stmt->bindParam(":cat", $prd->categoryId, \PDO::PARAM_INT);
$stmt->bindParam(":prov", $prd->providerId, \PDO::PARAM_INT);
$stmt->bindParam(":tax", $prd->taxCatId, \PDO::PARAM_INT);
$stmt->bindParam(":attr", $prd->attributeSetId, \PDO::PARAM_INT);
$stmt->bindParam(":scale", $db->boolVal($prd->scaled));
......
......@@ -23,8 +23,13 @@ namespace Pasteque;
class ProvidersService {
private static function buildDBprov($db_prov) {
return Provider::__build($db_prov['ID'], $db_prov['PARENTID'],
return Provider::__build($db_prov['ID'],
$db_prov['NAME'], $db_prov['IMAGE'] !== null,
$db_prov['FIRSTNAME'],$db_prov['LASTNAME'],$db_prov['EMAIL'],
$db_prov['PHONE'],$db_prov['PHONE2'],$db_prov['WEBSITE'],
$db_prov['FAX'],$db_prov['ADDRESS'],$db_prov['ADDRESS2'],
$db_prov['POSTAL'],$db_prov['CITY'],$db_prov['REGION'],
$db_prov['COUNTRY'],$db_prov['NOTES'],$db_prov['VISIBLE'],
$db_prov['DISPORDER']);
}
......@@ -66,7 +71,7 @@ class ProvidersService {
}
return null;
}
static function getImage($id) {
$pdo = PDOBuilder::getPDO();
$db = DB::get();
......@@ -100,22 +105,22 @@ class ProvidersService {
. "WEBSITE = :website, "
. "FAX = :fax, "
. "NOTES = :notes, "
. "DISPORDER = :order"
. "DISPORDER = :order, "
. "VISIBLE = :visible";
if ($image !== "") {
$sql .= ", IMAGE = :img";
}
$sql .= " WHERE ID = :id";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(":id", $id);
$stmt->bindParam(":id", $prov->id);
$stmt->bindParam(":name", $prov->label);
$stmt->bindParam(":add1",$prov->add1);
$stmt->bindParam(":add2",$prov->add2);
$stmt->bindParam(":addr1",$prov->addr1);
$stmt->bindParam(":addr2",$prov->addr2);
$stmt->bindParam(":zipCode",$prov->zipCode);
$stmt->bindParam(":city",$prov->city);
$stmt->bindParam(":region",$prov->region);
$stmt->bindParam(":country",$prov->country);
$stmt->bindParam(":firsName",$prov->firstName);
$stmt->bindParam(":firstName",$prov->firstName);
$stmt->bindParam(":lastName",$prov->lastName);
$stmt->bindParam(":email",$prov->email);
$stmt->bindParam(":phone1",$prov->phone1);
......@@ -123,9 +128,8 @@ class ProvidersService {
$stmt->bindParam(":website",$prov->website);
$stmt->bindParam(":fax",$prov->fax);
$stmt->bindParam(":notes",$prov->notes);
$stmt->bindParam(":visible",$prov->visible);
$stmt->bindParam(":order", $prov->dispOrder);
$stmt->bindParam(":img", $image, \PDO::PARAM_LOB);
$stmt->bindParam(":visible",$prov->visible);
if ($image !== "") {
$stmt->bindParam(":img", $image, \PDO::PARAM_LOB);
}
......@@ -139,7 +143,7 @@ class ProvidersService {
static function createprov($prov, $image = null) {
$pdo = PDOBuilder::getPDO();
$id = md5(time() . rand());
$sql = "INSERT INTO PROVIDERS (ID, NAME, IMAGE, ADDRESS, ADDRESS2, POSTAL, CITY, REGION, COUNTRY, FIRSTNAME, LASTNAME, EMAIL, PHONE, PHONE2, WEBSITE, FAX, NOTES, DISPORDER, VISIBLE "
$sql = "INSERT INTO PROVIDERS (ID, NAME, IMAGE, ADDRESS, ADDRESS2, POSTAL, CITY, REGION, COUNTRY, FIRSTNAME, LASTNAME, EMAIL, PHONE, PHONE2, WEBSITE, FAX, NOTES, DISPORDER, VISIBLE) "
. "VALUES (:id, :name, :img, :add1, :add2, :zipCode, :city, :region, :country, :firsName, :lastName, :email, :phone1, :phone2, :website, :fax, :notes, :order, :visible)";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(":id", $id);
......
......@@ -149,6 +149,9 @@ function form_input($form_id, $class, $object, $field, $type, $args = array()) {
case 'Category':
$data = CategoriesService::getAll();
break;
case 'Provider':
$data = ProvidersService::getAll();
break;
case 'TaxCategory':
$data = TaxesService::getAll();
break;
......
......@@ -192,11 +192,11 @@ CREATE TABLE PROVIDERS (
FAX VARCHAR(255),
NOTES VARCHAR(255),
DISPORDER INTEGER DEFAULT NULL,
VISIBLE BIT DEFAULT b'1' NOT NULL,
VISIBLE BIT DEFAULT b'1' NULL,
PRIMARY KEY (ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE PRODUCTS (
CREATE TABLE PRODUCTS (
ID VARCHAR(255) NOT NULL,
REFERENCE VARCHAR(255) NOT NULL,
CODE VARCHAR(255),
......@@ -205,6 +205,7 @@ CREATE TABLE PRODUCTS (
PRICEBUY DOUBLE,
PRICESELL DOUBLE NOT NULL,
CATEGORY VARCHAR(255) NOT NULL,
PROVIDER VARCHAR(255) NOT NULL,
TAXCAT VARCHAR(255) NOT NULL,
ATTRIBUTESET_ID VARCHAR(255),
STOCKCOST DOUBLE,
......
......@@ -206,6 +206,7 @@ CREATE TABLE PRODUCTS (
PRICEBUY DOUBLE PRECISION,
PRICESELL DOUBLE PRECISION NOT NULL,
CATEGORY VARCHAR NOT NULL,
PROVIDER VARCHAR NOT NULL,
TAXCAT VARCHAR NOT NULL,
ATTRIBUTESET_ID VARCHAR,
STOCKCOST DOUBLE PRECISION,
......
......@@ -44,6 +44,7 @@
"Product.label": "Name",
"Product.reference": "Reference",
"Product.category": "Category",
"Product.provider": "Provider",
"Product.dispOrder": "Order",
"Product.barcode": "Barcode",
"Product.taxCat": "VAT",
......@@ -59,6 +60,25 @@
"Category.parent": "Parent",
"Category.dispOrder": "Order",
"Provider.label": "Name",
"Provider.parent": "Parent",
"Provider.dispOrder": "Order",
"Provider.firstName": "First Name",
"Provider.lastName": "Last Name",
"Provider.email": "Email",
"Provider.phone1": "Phone",
"Provider.phone2": "GSM",
"Provider.website": "Website",
"Provider.fax": "Fax",
"Provider.addr1": "Address",
"Provider.addr2": "Address",
"Provider.zipCode": "Zip Code",
"Provider.city": "City",
"Provider.region": "State",
"Provider.country": "Country",
"Provider.notes": "Notes",
"Provider.visible": "Visible",
"Composition.label": "Name",
"Subgroup.label": "Name",
"Subgroup.dispOrder": "Display order",
......
......@@ -44,6 +44,7 @@
"Product.label": "Désignation",
"Product.reference": "Référence",
"Product.category": "Categorie",
"Product.provider": "Fournisseur",
"Product.dispOrder": "Ordre",
"Product.barcode": "Code barre",
"Product.taxCat": "TVA",
......@@ -59,6 +60,24 @@
"Category.parent": "Parent",
"Category.dispOrder": "Ordre",
"Provider.label": "Nom",
"Provider.dispOrder": "Ordre",
"Provider.firstName": "Prénom",
"Provider.lastName": "Nom",
"Provider.email": "Courriel",
"Provider.phone1": "Téléphone",
"Provider.phone2": "GSM",
"Provider.website": "Site web",
"Provider.fax": "Fax",
"Provider.addr1": "Adresse",
"Provider.addr2": "Adresse",
"Provider.zipCode": "Code postal",
"Provider.city": "Ville",
"Provider.region": "État/Région",
"Provider.country": "Pays",
"Provider.notes": "Notes",
"Provider.visible": "Visible",
"Composition.label": "Désignation",
"Subgroup.label": "Désignation",
"Subgroup.dispOrder": "Ordre",
......
......@@ -126,6 +126,7 @@ if (isset($_GET['id'])) {
}
$taxes = \Pasteque\TaxesService::getAll();
$categories = \Pasteque\CategoriesService::getAll();
$providers = \Pasteque\ProvidersService::getAll();
$level = NULL;
if ($stocks === TRUE && $product != NULL) {
......
......@@ -34,16 +34,16 @@ if (isset($_POST['id']) && isset($_POST['label'])) {
} else {
$img = "";
}
$parent_id = NULL;
if ($_POST['parentId'] !== "") {
$parent_id = $_POST['parentId'];
}
$dispOrder = 0;
if ($_POST['dispOrder'] !== "") {
$dispOrder = intval($_POST['dispOrder']);
}
$prov = \Pasteque\provider::__build($_POST['id'], $parent_id,
$_POST['label'], $img !== null, $dispOrder);
$prov = \Pasteque\provider::__build($_POST['id'], $_POST['label'], $img !== null,
$_POST['firstName'], $_POST['lastName'], $_POST['email'],
$_POST['phone1'], $_POST['phone2'], $_POST['website'], $_POST['fax'],
$_POST['addr1'], $_POST['addr2'], $_POST['zipCode'], $_POST['city'],
$_POST['region'], $_POST['country'], $_POST['notes'], $_POST['visible'],
$dispOrder);
if (\Pasteque\providersService::updateprov($prov, $img)) {
$message = \i18n("Changes saved");
} else {
......@@ -55,15 +55,17 @@ if (isset($_POST['id']) && isset($_POST['label'])) {
} else {
$img = NULL;
}
$parent_id = NULL;
if ($_POST['parentId'] !== "") {
$parent_id = $_POST['parentId'];
}
$dispOrder = 0;
if ($_POST['dispOrder'] !== "") {
$dispOrder = intval($_POST['dispOrder']);
}
$prov = new \Pasteque\provider($parent_id, $_POST['label'], $img, $dispOrder);
$prov = new \Pasteque\Provider($_POST['label'], $img !== null,
$_POST['firstName'], $_POST['lastName'], $_POST['email'],
$_POST['phone1'], $_POST['phone2'], $_POST['website'], $_POST['fax'],
$_POST['addr1'], $_POST['addr2'], $_POST['zipCode'], $_POST['city'],
$_POST['region'], $_POST['country'], $_POST['notes'], $_POST['visible'],
$dispOrder);
$id = \Pasteque\providersService::createprov($prov, $img);
if ($id !== FALSE) {
$message = \i18n("provider saved. <a href=\"%s\">Go to the provider page</a>.", PLUGIN_NAME, \Pasteque\get_module_url_action(PLUGIN_NAME, 'provider_edit', array('id' => $id)));
......@@ -83,9 +85,8 @@ if (isset($_GET['id'])) {
<form class="edit" action="<?php echo \Pasteque\get_current_url(); ?>" method="post" enctype="multipart/form-data">
<?php \Pasteque\form_hidden("edit", $provider, "id"); ?>
<?php \Pasteque\form_input("edit", "provider", $provider, "label", "string", array("required" => true)); ?>
<?php \Pasteque\form_input("edit", "provider", $provider, "parentId", "pick", array("model" => "provider", "nullable" => TRUE)); ?>
<?php \Pasteque\form_input("edit", "provider", $provider, "dispOrder", "numeric"); ?>
<?php \Pasteque\form_input("edit", "Provider", $provider, "label", "string", array("required" => true)); ?>
<?php \Pasteque\form_input("edit", "Provider", $provider, "dispOrder", "numeric"); ?>
<div class="row">
<label for="image"><?php \pi18n("Image", PLUGIN_NAME); ?></label>
<div style="display:inline-block">
......@@ -98,6 +99,23 @@ if (isset($_GET['id'])) {
<input type="file" name="image" />
</div>
</div>
<legend><?php \pi18n("Contact data", PLUGIN_NAME); ?></legend>
<?php \Pasteque\form_input("edit", "Provider", $provider, "firstName", "string"); ?>
<?php \Pasteque\form_input("edit", "Provider", $provider, "lastName", "string"); ?>
<?php \Pasteque\form_input("edit", "Provider", $provider, "email", "string"); ?>
<?php \Pasteque\form_input("edit", "Provider", $provider, "phone1", "string"); ?>
<?php \Pasteque\form_input("edit", "Provider", $provider, "phone2", "string"); ?>
<?php \Pasteque\form_input("edit", "Provider", $provider, "website", "string"); ?>
<?php \Pasteque\form_input("edit", "Provider", $provider, "fax", "string"); ?>
<?php \Pasteque\form_input("edit", "Provider", $provider, "addr1", "string"); ?>
<?php \Pasteque\form_input("edit", "Provider", $provider, "addr2", "string"); ?>
<?php \Pasteque\form_input("edit", "Provider", $provider, "zipCode", "string"); ?>
<?php \Pasteque\form_input("edit", "Provider", $provider, "city", "string"); ?>
<?php \Pasteque\form_input("edit", "Provider", $provider, "region", "string"); ?>
<?php \Pasteque\form_input("edit", "Provider", $provider, "country", "string"); ?>
<?php \Pasteque\form_input("edit", "Provider", $provider, "notes", "text"); ?>
<?php \Pasteque\form_input("edit", "Provider", $provider, "visible", "boolean"); ?>
</fieldset>
<div class="row actions">
<?php \Pasteque\form_save(); ?>
......
......@@ -51,16 +51,16 @@ $providers = \Pasteque\providersService::getAll();
<thead>
<tr>
<th></th>
<th><?php \pi18n("provider.label"); ?></th>
<th><?php \pi18n("Provider.label"); ?></th>
<th></th>
</tr>
</thead>
<tbody>
<?php
function printprovider($printprovegory, $level, &$par) {
function printprovider($printprovider, $level, &$par) {
$par = !$par;
if ($printprovider->hasImage) {
$imgSrc = \Pasteque\PT::URL_ACTION_PARAM . "=img&w=provider&id=" . $printprovegory->id;
$imgSrc = \Pasteque\PT::URL_ACTION_PARAM . "=img&w=provider&id=" . $printprovider->id;
} else {
$imgSrc = \Pasteque\PT::URL_ACTION_PARAM . "=img&w=provider";
}
......@@ -76,25 +76,18 @@ function printprovider($printprovegory, $level, &$par) {
<td><?php echo $printprovider->label; ?></td>
<td class="edition">
<?php \Pasteque\tpl_btn("edition", \Pasteque\get_module_url_action(PLUGIN_NAME,
'provider_edit', array("id" => $printprovegory->id)), "",
'provider_edit', array("id" => $printprovider->id)), "",
'img/edit.png', \i18n('Edit'), \i18n('Edit'));
?>
<form action="<?php echo \Pasteque\get_current_url(); ?>" method="post"><?php \Pasteque\form_delete("prov", $printprovider->id, \Pasteque\get_template_url() . 'img/delete.png') ?></form>
</td>
</tr>
<?php
$providers = \Pasteque\providersService::getChildren($printprovider->id);
$level++;
foreach($providers as $childprovider) {
printprovider($childprovegory, $level, $par);
}
}
$par = false;
foreach ($providers as $provider) {
if($provider->parentId == "") {
printprovider($provegory, 0, $par); // we start with root providers. As the function is recursive, we don’t need more than this :-)
}
printprovider($provider, 0, $par);
}
?>
</tbody>
......
......@@ -25,9 +25,10 @@ function init() {
$MENU->addSection("catalog", "Catalog", PLUGIN_NAME);
$MENU->registerModuleEntry("catalog", PLUGIN_NAME, "menu_tax.png", "Taxes", "taxes");
$MENU->registerModuleEntry("catalog", PLUGIN_NAME, "menu_category.png", "Categories", "categories");
$MENU->registerModuleEntry("catalog", PLUGIN_NAME, "menu_category.png", "Providers", "providers");
$MENU->registerModuleEntry("catalog", PLUGIN_NAME, "menu_product.png", "Products", "products");
\Pasteque\register_i18n(PLUGIN_NAME);
}
\Pasteque\hook("module_load", __NAMESPACE__ . "\init");
?>
\ No newline at end of file
?>
......@@ -23,6 +23,15 @@
"No category found": "No category found",
"Category saved. <a href=\"%s\">Go to the category page</a>.": "Category saved. <a href=\"%s\">Go to the category page</a>.",
"Providers": "Providers",
"Edit a provider": "Edit a provider",
"Import providers": "Import providers",
"Add a provider": "Add a provider",
"%d providers": "%d providers",
"No provider found": "No provider found",
"Contact data": "Contact data",
"Provider saved. <a href=\"%s\">Go to the provider page</a>.": "Provider saved. <a href=\"%s\">Go to the provider page</a>.",
"Taxes": "Taxes",
"Add a tax": "Add a tax",
"Edit tax": "Edit tax",
......@@ -54,4 +63,5 @@
"Reference": "Reference",
"Quantity": "Quantity"
}
......@@ -18,10 +18,19 @@
"Categories": "Categories",
"Edit a category": "Édition d'une categorie",
"Add a category": "Ajouter une catégorie",
"%d categories": "%d categories",
"%d categories": "%d catégories",
"No category found": "Pas de categorie trouvée",
"Category saved. <a href=\"%s\">Go to the category page</a>.": "Catégorie enregistrée. <a href=\"%s\">Aller à la page de la catégorie</a>.",
"Providers": "Fournisseurs",
"Edit a provider": "Éditer un fournisseur",
"Import providers": "Importer des fournisseurs",
"Add a provider": "Ajouter un fournisseur",
"%d providers": "%d fournisseurs",
"No provider found": "Pas de fournisseur trouvé",
"Contact data": "Informations de contact",
"Provider saved. <a href=\"%s\">Go to the provider page</a>.": "Fournisseur enregistré. <a href=\"%s\">Aller à la page du fournisseur</a>.",
"Taxes": "Taxes",
"Add a tax": "Ajouter une taxe",
"Edit tax": "Édition de la taxe",
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment