Para subir el catálogo de productos, se hace directo en el servidor de Máxima (https://maxima.anubbers.com:2083). Dentro de file manager nos ubicamos en la siguiente ruta, /Maxima-Odnos/cron/automation y en esta carpeta subiremos el archivo de excel que nos proporcionen. Es importante que el nombre del archivo no contenga acentos, la letra ñ/Ñ y espacios, estos últimos pueden ser sustituidos por guión bajo (_) o medio (-).
El archivo que nos ayudará para la carga de productos es update-products.php, este valida si el producto ya se encuentra en la base de datos para no volver a cargar un nuevo registro y haya repeticiones de productos.
La lectura del archivo de excel se realiza con la librería PhpSpreadsheet, para más información sobre la documentación dejo el siguiente enlace: https://phpspreadsheet.readthedocs.io/en/latest/
En la primer parte del código, escribiremos el nombre del archivo de excel tal cual viene junto con la extensión:
$inputFileName = __DIR__ . '/nombre_archivo.xlsx'; //nombre del archivo
try {
// $inputFileType = \PhpOffice\PhpSpreadsheet\IOFactory::identify($inputFileName);
// $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType);
// $reader->setReadDataOnly(true);
// $spreadsheet = $reader->load($inputFileName);
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($inputFileName);
} catch (\PhpOffice\PhpSpreadsheet\Reader\Exception $e) {
echo "Cant read file: " . $e;
}
En la siguiente sección se establecen las propiedades de como vamos a leer el archivo, de preferencia colocar el catálogo en la primer hoja ya que la lectura empieza en el índice 0.
// Open sheet
$sheet = $spreadsheet->getSheet(0);
// Get worksheet dimensions
$highestRow = $sheet->getHighestRow();
$highestCol = $sheet->getHighestColumn();
La siguiente sección es el ciclo de lectura del contenido, la variable row iniciara en la fila donde empiezan los productos, es el número tal cual viene en el archivo de excel, vamos a descartar la filas donde estén los títulos de la columnas.
//loop for rows
for ($row = 3; $row <= $highestRow; $row++) {
$sku = trim(strtoupper($sheet->getCell("A".$row)->getValue() ?? ""));
$name = trim(ucwords(strtolower($sheet->getCell("B".$row)->getValue() ?? "")));
$blind = trim(ucwords(strtolower($sheet->getCell("C".$row)->getValue() ?? "")));
$group = trim(ucwords(strtolower($sheet->getCell("D".$row)->getValue() ?? "")));
$subgroup = trim(ucwords(strtolower($sheet->getCell("E".$row)->getValue() ?? "")));
$family = trim(ucwords(strtolower($sheet->getCell("F".$row)->getValue() ?? "")));
...
}
Esta parte es importante porque vamos a ir seteando las variables de acuerdo a la columna, revisa que la información coincida con el layout, en dado caso que haya cambios, actualizaremos la columna en el método getCell.
Ya que tengamos las variables, prepararemos la instancia de Productv2( ) y el arreglo en caso de que se trate de un producto nuevo para agregarlo por el método create.
$product = new Productv2();
$productArray = array(
"idAccount" => $idAccount,
"idUser" => "0",
"name" => $name,
"slug" => $product->slug($name, $idAccount),
"sku" => $sku,
"idSupplier" => $supplier->id ?? 0,
"priceRegSub" => $priceRegSub,
"acqCost" => $acqCost,
"large" => $large,
"width" => $width,
"height" => $height,
"type" => $type,
"claveSat" => $cveSAT,
"unit" => $unitCode,
"showInWeb" => $showInWeb,
);
Aquí se hará la validación para saber si el producto ya se encuentra en la base de datos, si ya está sólo realiza las actualizaciones del inventario, en caso contrario se creará el registro del producto incluyendo los metas y las categorías.
if($product->findBySku($sku, $idAccount)) {
//update inventory
} else {
//create product
//metas
//categories
//inventory
}