importzugferd/mapping.php

274 lines
9.7 KiB
PHP

<?php
/* Copyright (C) 2026 ZUGFeRD Import Module
*
* 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
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*/
/**
* \file mapping.php
* \ingroup importzugferd
* \brief Product mapping management
*/
// Load Dolibarr environment
$res = 0;
if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
$res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
}
$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME'];
$tmp2 = realpath(__FILE__);
$i = strlen($tmp) - 1;
$j = strlen($tmp2) - 1;
while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
$i--;
$j--;
}
if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
$res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
}
if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
$res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
}
if (!$res && file_exists("../main.inc.php")) {
$res = @include "../main.inc.php";
}
if (!$res && file_exists("../../main.inc.php")) {
$res = @include "../../main.inc.php";
}
if (!$res && file_exists("../../../main.inc.php")) {
$res = @include "../../../main.inc.php";
}
if (!$res) {
die("Include of main fails");
}
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
dol_include_once('/importzugferd/class/productmapping.class.php');
dol_include_once('/importzugferd/lib/importzugferd.lib.php');
// Load translation files
$langs->loadLangs(array("importzugferd@importzugferd", "products", "companies"));
// Security check
if (!$user->hasRight('importzugferd', 'mapping', 'write')) {
accessforbidden();
}
// Get parameters
$action = GETPOST('action', 'aZ09');
$confirm = GETPOST('confirm', 'alpha');
$id = GETPOST('id', 'int');
$supplier_id = GETPOST('supplier_id', 'int');
// Form fields
$supplier_ref = GETPOST('supplier_ref', 'alpha');
$product_id = GETPOST('product_id', 'int');
$ean = GETPOST('ean', 'alpha');
$manufacturer_ref = GETPOST('manufacturer_ref', 'alpha');
$description = GETPOST('description', 'alpha');
$priority = GETPOST('priority', 'int');
// Initialize objects
$mapping = new ProductMapping($db);
$form = new Form($db);
$error = 0;
/*
* Actions
*/
// Add mapping
if ($action == 'add') {
if (empty($supplier_id) || $supplier_id <= 0) {
setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentities('Supplier')), null, 'errors');
$error++;
}
if (empty($supplier_ref)) {
setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentities('SupplierRef')), null, 'errors');
$error++;
}
if (empty($product_id) || $product_id <= 0) {
setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentities('Product')), null, 'errors');
$error++;
}
if (!$error) {
$mapping->fk_soc = $supplier_id;
$mapping->supplier_ref = $supplier_ref;
$mapping->fk_product = $product_id;
$mapping->ean = $ean;
$mapping->manufacturer_ref = $manufacturer_ref;
$mapping->description = $description;
$mapping->priority = $priority;
$result = $mapping->create($user);
if ($result > 0) {
setEventMessages($langs->trans('MappingCreated'), null, 'mesgs');
header('Location: '.$_SERVER['PHP_SELF'].'?supplier_id='.$supplier_id);
exit;
} else {
setEventMessages($mapping->error, null, 'errors');
}
}
$action = '';
}
// Delete mapping
if ($action == 'confirm_delete' && $confirm == 'yes') {
$mapping->fetch($id);
$save_supplier_id = $mapping->fk_soc;
$result = $mapping->delete($user);
if ($result > 0) {
setEventMessages($langs->trans('MappingDeleted'), null, 'mesgs');
header('Location: '.$_SERVER['PHP_SELF'].'?supplier_id='.$save_supplier_id);
exit;
} else {
setEventMessages($mapping->error, null, 'errors');
}
}
/*
* View
*/
$title = $langs->trans('ProductMapping');
llxHeader('', $title, '', '', 0, 0, '', '', '', 'mod-importzugferd page-mapping');
print load_fiche_titre($title, '', 'fa-exchange-alt');
// Confirm delete
if ($action == 'delete') {
print $form->formconfirm(
$_SERVER['PHP_SELF'].'?id='.$id.'&supplier_id='.$supplier_id,
$langs->trans('DeleteMapping'),
$langs->trans('ConfirmDeleteMapping'),
'confirm_delete',
'',
0,
1
);
}
// Supplier selection
print '<form method="GET" action="'.$_SERVER['PHP_SELF'].'">';
print '<div class="div-table-responsive-no-min">';
print '<table class="noborder centpercent">';
print '<tr class="liste_titre">';
print '<td colspan="2">'.$langs->trans('SelectSupplier').'</td>';
print '</tr>';
print '<tr class="oddeven">';
print '<td class="titlefield">'.$langs->trans('Supplier').'</td>';
print '<td>';
print $form->select_company($supplier_id, 'supplier_id', 's.fournisseur = 1', 'SelectThirdParty', 0, 0, null, 0, 'minwidth300');
print ' <input type="submit" class="button smallpaddingimp" value="'.$langs->trans('Select').'">';
print '</td>';
print '</tr>';
print '</table>';
print '</div>';
print '</form>';
// If supplier selected, show mappings and add form
if ($supplier_id > 0) {
$supplier = new Societe($db);
$supplier->fetch($supplier_id);
print '<br>';
// Add new mapping form
print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">';
print '<input type="hidden" name="token" value="'.newToken().'">';
print '<input type="hidden" name="action" value="add">';
print '<input type="hidden" name="supplier_id" value="'.$supplier_id.'">';
print '<div class="div-table-responsive-no-min">';
print '<table class="noborder centpercent">';
print '<tr class="liste_titre">';
print '<td colspan="6">'.$langs->trans('AddMapping').' - '.$supplier->getNomUrl(1).'</td>';
print '</tr>';
print '<tr class="oddeven">';
print '<td class="titlefield fieldrequired">'.$langs->trans('SupplierRef').'</td>';
print '<td><input type="text" name="supplier_ref" value="'.dol_escape_htmltag($supplier_ref).'" class="minwidth200" required></td>';
print '<td class="fieldrequired">'.$langs->trans('Product').'</td>';
print '<td>'.$form->select_produits($product_id, 'product_id', '', 0, 0, -1, 2, '', 0, array(), 0, '1', 0, 'minwidth300', 0, '', null, 1).'</td>';
print '<td>'.$langs->trans('EAN').'</td>';
print '<td><input type="text" name="ean" value="'.dol_escape_htmltag($ean).'" class="minwidth150"></td>';
print '</tr>';
print '<tr class="oddeven">';
print '<td>'.$langs->trans('ManufacturerRef').'</td>';
print '<td><input type="text" name="manufacturer_ref" value="'.dol_escape_htmltag($manufacturer_ref).'" class="minwidth200"></td>';
print '<td>'.$langs->trans('Description').'</td>';
print '<td><input type="text" name="description" value="'.dol_escape_htmltag($description).'" class="minwidth200"></td>';
print '<td>'.$langs->trans('Priority').'</td>';
print '<td><input type="number" name="priority" value="'.($priority ?: 0).'" class="width75"></td>';
print '</tr>';
print '<tr class="oddeven">';
print '<td colspan="6" class="center">';
print '<input type="submit" class="button button-primary" value="'.$langs->trans('Add').'">';
print '</td>';
print '</tr>';
print '</table>';
print '</div>';
print '</form>';
// Existing mappings
print '<br>';
print '<div class="div-table-responsive">';
print '<table class="noborder centpercent">';
print '<tr class="liste_titre">';
print '<td>'.$langs->trans('SupplierRef').'</td>';
print '<td>'.$langs->trans('Product').'</td>';
print '<td>'.$langs->trans('EAN').'</td>';
print '<td>'.$langs->trans('ManufacturerRef').'</td>';
print '<td>'.$langs->trans('Description').'</td>';
print '<td class="center">'.$langs->trans('Priority').'</td>';
print '<td class="center">'.$langs->trans('Active').'</td>';
print '<td class="center">'.$langs->trans('Action').'</td>';
print '</tr>';
$mappings = $mapping->fetchAllBySupplier($supplier_id);
if (count($mappings) > 0) {
foreach ($mappings as $m) {
print '<tr class="oddeven">';
print '<td>'.dol_escape_htmltag($m['supplier_ref']).'</td>';
print '<td>';
$product = new Product($db);
$product->fetch($m['fk_product']);
print $product->getNomUrl(1);
print '</td>';
print '<td>'.dol_escape_htmltag($m['ean']).'</td>';
print '<td>'.dol_escape_htmltag($m['manufacturer_ref']).'</td>';
print '<td>'.dol_escape_htmltag($m['description']).'</td>';
print '<td class="center">'.$m['priority'].'</td>';
print '<td class="center">';
print $m['active'] ? img_picto($langs->trans('Active'), 'statut4') : img_picto($langs->trans('Inactive'), 'statut5');
print '</td>';
print '<td class="center">';
print '<a href="'.$_SERVER['PHP_SELF'].'?action=delete&id='.$m['id'].'&supplier_id='.$supplier_id.'&token='.newToken().'">';
print img_picto($langs->trans('Delete'), 'delete');
print '</a>';
print '</td>';
print '</tr>';
}
} else {
print '<tr class="oddeven"><td colspan="8" class="opacitymedium">'.$langs->trans('NoMappingsFound').'</td></tr>';
}
print '</table>';
print '</div>';
}
llxFooter();
$db->close();