""" Utilidad puntual (no forma parte del pipeline recurrente): crea una Entrada de Mercancía (InventoryGenEntries) en SAP con todos los SKU del grupo de artículos indicado, para dejar el stock inicial en un almacén. Uso: .venv/bin/python tools/cargar_entrada_mercancia.py config/stores/snobbycl.json \ --warehouse 8801 --price 5000 --account 1-1-080-40-000 --quantity 1000 Agregar --apply para ejecutar el POST real (por defecto es dry-run). """ import argparse import json import sys from pathlib import Path from typing import List sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) from core.config import cargar_config_tienda from core.errors import SAPServiceLayerError from core.sap import SAPServiceLayerClient ITEMS_GROUP_CODE = 108 def obtener_skus_grupo(sap: SAPServiceLayerClient, group_code: int) -> List[str]: resp = sap.forward( "GET", "Items", params={"$select": "ItemCode", "$filter": f"ItemsGroupCode eq {group_code}"}, extra_headers={"B1S-PageSize": "1000"}, ) data = resp.json() return [i["ItemCode"] for i in data.get("value", [])] def main(store_config_path: str, warehouse: str, price: float, account: str, quantity: float, dry_run: bool) -> None: store_config = cargar_config_tienda(store_config_path) sap = SAPServiceLayerClient.from_store_config(store_config["sap_connection"]) skus = obtener_skus_grupo(sap, ITEMS_GROUP_CODE) print(f"SKUs encontrados en grupo {ITEMS_GROUP_CODE}: {len(skus)}") document_lines = [ { "ItemCode": sku, "WarehouseCode": warehouse, "Quantity": quantity, "UnitPrice": price, "AccountCode": account, } for sku in skus ] payload = {"DocumentLines": document_lines} if dry_run: print(json.dumps(payload["DocumentLines"][:3], indent=2, ensure_ascii=False)) print(f"... ({len(document_lines)} líneas en total, almacén={warehouse}, precio={price}, cuenta={account}, cantidad={quantity})") print("(dry-run: no se envió nada a SAP, correr con --apply para crear el documento)") return try: resp = sap.forward("POST", "InventoryGenEntries", json_data=payload) data = resp.json() print(f"Entrada de mercancía creada. DocEntry={data.get('DocEntry')} DocNum={data.get('DocNum')}") except SAPServiceLayerError as exc: print(f"ERROR creando la entrada de mercancía: {exc.detail}") if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("store_config") parser.add_argument("--warehouse", required=True) parser.add_argument("--price", type=float, required=True) parser.add_argument("--account", required=True) parser.add_argument("--quantity", type=float, required=True) parser.add_argument("--apply", action="store_true", help="Ejecuta el POST real (por defecto es dry-run)") args = parser.parse_args() main(args.store_config, args.warehouse, args.price, args.account, args.quantity, dry_run=not args.apply)