{"id":16329281,"url":"https://github.com/josantonius/php-mercadona-importer","last_synced_at":"2025-03-20T22:32:03.567Z","repository":{"id":65472893,"uuid":"592533981","full_name":"josantonius/php-mercadona-importer","owner":"josantonius","description":"PHP command line interface (CLI) application to import products from Mercadona using their API","archived":false,"fork":false,"pushed_at":"2024-05-21T16:49:30.000Z","size":121,"stargazers_count":11,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-17T18:33:30.144Z","etag":null,"topics":["cli","mercadona","mercadona-api","mercadona-importer","php"],"latest_commit_sha":null,"homepage":"https://josantonius.dev","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/josantonius.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["Josantonius"]}},"created_at":"2023-01-23T23:35:31.000Z","updated_at":"2024-10-14T22:25:55.000Z","dependencies_parsed_at":"2024-05-21T17:56:46.232Z","dependency_job_id":null,"html_url":"https://github.com/josantonius/php-mercadona-importer","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josantonius%2Fphp-mercadona-importer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josantonius%2Fphp-mercadona-importer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josantonius%2Fphp-mercadona-importer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josantonius%2Fphp-mercadona-importer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/josantonius","download_url":"https://codeload.github.com/josantonius/php-mercadona-importer/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244704041,"owners_count":20496231,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","mercadona","mercadona-api","mercadona-importer","php"],"created_at":"2024-10-10T23:15:00.314Z","updated_at":"2025-03-20T22:32:03.222Z","avatar_url":"https://github.com/josantonius.png","language":"PHP","funding_links":["https://github.com/sponsors/Josantonius"],"categories":["Supermercados"],"sub_categories":["Lenguas Cooficiales"],"readme":"# PHP Mercadona Importer CLI\n\n[![Latest Stable Version](https://poser.pugx.org/josantonius/mercadona-importer/v/stable)](https://packagist.org/packages/josantonius/mercadona-importer)\n[![License](https://poser.pugx.org/josantonius/mercadona-importer/license)](LICENSE)\n[![Total Downloads](https://poser.pugx.org/josantonius/mercadona-importer/downloads)](https://packagist.org/packages/josantonius/mercadona-importer)\n[![CI](https://github.com/josantonius/php-mercadona-importer/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/josantonius/php-mercadona-importer/actions/workflows/ci.yml)\n[![PSR1](https://img.shields.io/badge/PSR-1-f57046.svg)](https://www.php-fig.org/psr/psr-1/)\n[![PSR4](https://img.shields.io/badge/PSR-4-9b59b6.svg)](https://www.php-fig.org/psr/psr-4/)\n[![PSR12](https://img.shields.io/badge/PSR-12-1abc9c.svg)](https://www.php-fig.org/psr/psr-12/)\n\nAplicación PHP de interfaz de línea de comandos (CLI) para importar productos de Mercadona utilizando su API.\n\n---\n\n- [Requerimientos](#requerimientos)\n- [Instalación](#instalación)\n- [Uso](#uso)\n- [Configuración](#configuración)\n- [Pruebas](#pruebas)\n- [Tareas pendientes](#tareas-pendientes)\n- [Registro de Cambios](#registro-de-cambios)\n- [Contribuir](#contribuir)\n- [Patrocinar](#patrocinar)\n- [Licencia](#licencia)\n\n---\n\n## Requerimientos\n\n- Sistema operativo: Linux.\n- Versiones PHP: 8.1 | 8.2 | 8.3.\n- Docker (opcional)\n\n## Instalación\n\nClona el repositorio:\n\n```console\ngit clone https://github.com/josantonius/php-mercadona-importer.git\n```\n\nAccede al repositorio clonado:\n\n```console\ncd php-mercadona-importer\n```\n\nInstala las dependencias:\n\n```console\ncomposer install\n```\n\nO con Docker ejecutando:\n```console\nmake init\n```\n\n## Uso\n\nRevisa la [configuración](#configuración) y ejecuta el script para iniciar la importación:\n\n```console\nphp mercadona-importer.php\n```\n\nO si prefieres usarlo con Docker, bastará con ejecutar:\n\n```console\nmake sync\n```\n\n![Importación](.github/docs/images/import.png)\n\nPara cada detalle del producto se utiliza la siguiente estructura:\n\n```txt\nmixed value\narray previous\nint   timestamp\n```\n\nDe esta manera los datos no se sobrescriben al actualizar los productos, permitiendo mantener un\nhistorial de cambios para cualquier detalle:\n\n```jsonc\n\"unit_price\": {\n    \"value\": \"7.90\", // Valor actual\n    \"previous\": [\n        {\n            \"value\": \"7.40\",  // Valor del día 20-01-2023\n            \"timestamp\": 1674252044\n        },\n        {\n            \"value\": \"7.10\",  // Valor del día 21-01-2023\n            \"timestamp\": 1674338444\n        }\n    ],\n    \"timestamp\": 1674511244 // 23-01-2023\n}\n```\n\n[EJEMPLO DE PRODUCTO IMPORTADO](.github/docs/products/10379.json)\n\n## Configuración\n\nPuedes modificar las opciones de importación editando el archivo\n[mercadona-importer.php](mercadona-importer.php) situado en la raíz del proyecto:\n\n```php\nnew MercadonaImporter(\n    warehouse: 'svq1',\n    timezone: 'Europe/Madrid',\n    delayForError: 300000000,\n    delayForRequests: 1300000,\n    includeFullProduct: false,\n    reimportFullProduct: false,\n    logDirectory: __DIR__ . '/logs/',\n    outputDirectory: __DIR__ . '/products/',\n);\n```\n\n### `warehouse`\n\n```php\nwarehouse: 'svq1'\n```\n\nMercadona muestra diferentes versiones de la tienda dependiendo de la ubicación de los usuarios.\nPara ello asigna un almacén según el código postal desde el que se acceda.\n\nEsto implica que, según el almacén desde el que se importe:\n\n- El número de productos importados variará ya que dependerá de los que tengan habilitados.\n- Un mismo producto puede tener diferentes detalles (peso, precio...) según la ubicación.\n\nAlgunos identificadores de centros logísticos que se utilizan son:\n\n- `2343` - Murcia\n- `2749` - Lleida\n- `3532` - Valencia\n- `3947` - Tarragona\n- `3951` - Girona\n- `3996` - Barcelona\n- `4068` - Barcelona\n- `4069` - Barcelona\n- `4097` - Barcelona\n- `4230` - Navarra\n- `4267` - Álava\n- `4354` - Almería\n- `4385` - Castellón\n- `4416` - Girona\n- `4472` - Barcelona\n- `4558` - Castellón\n- `4697` - Álava\n- `alc1` - Alicante y Murcia\n- `bcn1` - Barcelona\n- `mad1` - Madrid\n- `mad2` - Madrid\n- `svq1` - Sevilla, Cádiz y Huelva\n- `vlc1` - Valencia\n\n_Otros identificadores de almacenes facilitados por [Joel Taylor](https://github.com/jtayped),\ncreador de [mercapy](https://github.com/jtayped/mercapy)_:\n\n- `2183`, `2581`, `2623`, `3684`, `3968`, `4028`, `4115`, `4281`\n- `4293`, `4308`, `4421`, `4436`, `4483`, `4537`, `4572`, `4644`\n\n### `timezone`\n\n```php\ntimezone: 'Europe/Madrid'\n```\n\nSe utiliza para la hora de los archivos de logs:\n\n```txt\n[2023-01-24T18:32:45.876599+01:00] LOG.INFO: Retomando la importación desde la categoría 163.\n```\n\n### `delayForError`\n\n```php\ndelayForError: 300000000 // 300 segundos\n```\n\nTiempo en microsegundos que se pausará la importación al recibir un error 429 por exceso de peticiones.\n\n![Importación error](.github/docs/images/error-import.png)\n\n### `delayForRequests`\n\n```php\ndelayForRequests: 1300000 // 1,3 segundos\n```\n\nIntervalo en microsegundos en el que se realizarán las peticiones a la API de Mercadona.\n\n### `includeFullProduct`\n\n```php\nincludeFullProduct: false\n```\n\nAl importar una categoría se obtienen todos los productos de ella, sin embargo los productos tienen\n[detalles resumidos](.github/docs/products/category-product.json). Si se activa esta opción,\nse importarán los [detalles completos](.github/docs/products/full-product.json) del producto en **una\nsola ocasión** (al agregarlo por primera vez o si no se hizo en importaciones anteriores).\n\n**IMPORTANTE** - Activar esta opción aumenta considerablemente el número de peticiones que se realizan\ny el tiempo de ejecución, ya que si todos los productos son nuevos se realizará una petición por cada\nuno de ellos:\n\n- Importar con detalles resumidos: unas 150 peticiones y la importación dura unos 3-4 minutos.\n- Importar con detalles completos: más de 5000 peticiones y la importación dura más de 4 horas.\n\n### `reimportFullProduct`\n\n```php\nreimportFullProduct: false\n```\n\nFuerza la importación de los detalles completos del producto aunque se hubiese hecho anteriormente.\n\n**IMPORTANTE** - Las mismas consideraciones que con la opción `includeFullProduct`.\n\n### `logDirectory`\n\n```php\nlogDirectory: __DIR__ . '/logs/'\n```\n\nDirectorio donde se guardarán los logs.\n\n### `outputDirectory`\n\n```php\noutputDirectory: __DIR__ . '/data/'\n```\n\nDirectorio donde se guardarán los archivos importados.\n\nLos productos se almacenan en formato JSON utilizando el ID del producto como nombre y se organizan\npor carpetas según el almacén que se utilice al importarlos:\n\n`/data/svq1/39922.json`\n\n`/data/mad1/39922.json`\n\n`/data/bcn1/39922.json`\n\nTambién se genera el archivo `/data/product_mapping.json` que contiene el catálogo completo de\nproductos con información básica:\n\n```json\n{\n    \"id\": \"39922\",\n    \"ean\": \"8480000399229\",\n    \"slug\": \"zumo-de-manzana\",\n    \"name\": \"Zumo de manzana\",\n    \"warehouses\": [\"svq1\", \"mad1\", \"bcn1\"]\n}\n```\n\n## Pruebas\n\nRun code standard tests with [PHPCS](https://github.com/squizlabs/PHP_CodeSniffer):\n\n```console\ncomposer phpcs\n```\n\nRun [PHP Mess Detector](https://phpmd.org/) tests to detect inconsistencies in code style:\n\n```console\ncomposer phpmd\n```\n\nRun all previous tests:\n\n```console\ncomposer tests\n```\n\n## Tareas pendientes\n\n- [ ] Refactorizar la clase `MercadonaImporter`\n- [ ] Desarrollar pruebas unitarias y funcionales\n- [ ] Documentar métodos\n\n## Registro de Cambios\n\nLos cambios detallados de cada versión se documentan en las\n[notas de la misma](https://github.com/josantonius/php-mercadona-api/releases).\n\n## Contribuir\n\nPor favor, asegúrate de leer la [guía de contribución](.github/CONTRIBUTING.md), antes de hacer un\npull request, comenzar una discusión o reportar un issue.\n\n¡Gracias por [colaborar](https://github.com/josantonius/php-mercadona-api/graphs/contributors)! :heart:\n\n## Patrocinar\n\nSi este proyecto te ayuda a reducir el tiempo de desarrollo,\n[puedes patrocinarme](https://github.com/josantonius#sponsor) para apoyar mi trabajo :blush:\n\n## Licencia\n\nEste repositorio tiene una licencia [MIT License](LICENSE).\n\nCopyright © 2023-present, [Josantonius](https://github.com/josantonius#contact)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjosantonius%2Fphp-mercadona-importer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjosantonius%2Fphp-mercadona-importer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjosantonius%2Fphp-mercadona-importer/lists"}