Ridurre il carico di lavoro aziendale: responsabile acquisti

Se hai una azienda che richiede input fisici o materia prima, saprai meglio di STATiCalmo che organizzare le scorte significa evitare brutte sorprese. Grazie alla programmazione, si possono risparmiare ore-uomo della segretaria o del responsabile acquisti. Se tu, titolare o imprenditore, ti occupi direttamente degli acquisti, vedo un problema, ma questo fa parte di un altro discorso. In questo articolo non parlerò proprio di statistica, citerò il linguaggio R, che proviene dalla statistica. Ciò che segue ha più a che fare con l’informatica, o se proprio vogliamo fare i pomposi, con un’intelligenza artificiale che fa parte del dominio dei sistemi esperti (expert systems). Chiaramente per sapere quando fare acquisti, serve un cruscotto dati statistico, o comunque una tabella che indica “quantità critiche”.

 

Sui fogli di calcolo come Excel o Google Sheets abbiamo le macro: una automazione che ripete delle azioni che abbiamo registrato. Chiaramente hanno senso se abbiamo registrato azioni od operazioni ripetitive. Se vogliamo automatizzare azioni esterne a quei due ambienti, ad esempio su un browser web (Chrome, Firefox, Safari, etc.), possiamo utilizzare uno strumento che ci permette di programmare azioni. Mi riferisco alla libreria Selenium, che su R troviamo col nome Rselenium. Esiste anche su Python, Javascript. Sull’ultimo linguaggio, esiste una libreria più apprezzata di nome Cypress. 

 

Selenium ha una definizione che non lo rende proprio trovabile da un non addetto ai lavori: automazione del browser. Cypress ne ha una ancora più difficile da agganciare all’obiettivo di questo articolo: automazione dei test su applicazioni web. 

 

Con Selenium programmeremo varie operazioni, ridotte rispetto un caso più reale, che prese singolarmente non fanno pensare ad un comportamento intelligente:

 

  1. Inserire i link (URL) dei prodotti che acquistiamo più spesso. Aggiungere alternative complicherebbe il processo.
  2. Aprire i link controllando la disponibilità di ogni prodotto. 
  3. Fare clic su “Aggiungi al carrello” per ogni prodotto che ha passato il controllo precedente
  4. Eseguire il pagamento. E qui viene la parte più delicata dal punto di vista della sicurezza. 

# idealmente questo codice va integrato con un cameriere dei dati (API)
# che chiama questo servizio quando vengono raggiunti numeri "critici"
# sulle scorte, presenti ad esempio su un foglio di calcolo di Google
# o/e ERP 
library("RSelenium")

### Parte scorrevole ----

# create driver object
driver<-rsDriver(browser="firefox", port=4550L, verbose=F, chromever = NULL) 
#scelgo FireFox per un motivo preciso. Se non lo hai, installalo
# pulisci memoria, console, objects prima di riavviarlo

# Apri la pagina di Amazon, ovviamente business.amazon ha più senso
driver$client$navigate("https://www.amazon.it")

# qui inserirai gli acquisti periodici
tutti_urls <- c("https://www.amazon.it/Farina-Caputo-Pizzeria-Kg-Cartone/dp/B07QCGS8JH/ref=sr_1_1?__mk_it_IT=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=3B57LQMB2P209&dib=eyJ2IjoiMSJ9.wbge344vLMdlohBrasE6P5cgk0DxKFEdlZI221RPOpbuSpxfeg7dGptWwuWs45OnC2H-L6mebdBXIpll_YtSZp8WA7T-hgl6TZYJDqMrb74zxmI6WT-qkpG2oHG-np1P_vtLO_ya3I1vu5ixh1LOnjR3rxYgaDjUIRzXIr1vzuofYfJG8kIDpV_AYul6ZEn6RMyXHYL04yTknESQC2cLk8YOmFZyoxBUC8SVnrAvAvQbFcsjtp5wg0KU_pYXGyt4SyTzdsEhKbLMnpHG1ArDuQFhu4feKDKd_Xq0dPksp68.7fV-948QxQrzI9iQpHOl6MO4ceXpYwefuI1fLc86ZNQ&dib_tag=se&keywords=farina+caputo&qid=1714286670&sprefix=farina+caputo%2Caps%2C144&sr=8-1",
                "https://www.amazon.it/MOZZARELLA-PIZZA-MONTANINA-5Kg-ABBASCIANO/dp/B0C4LHYSC1/ref=sr_1_10?crid=3HF5ELPOZ6IEA&dib=eyJ2IjoiMSJ9.ygT1FDeOXWue8yX7pOXfhsoPpyeyXA0M3mWx27Xuu0uyyBq616MVGfeV1wAoxVYYGX8s65Rd3rzHe6Ppg_UjafvjEPWR5OSM4Kl3FbGyNmn554Jf3-zH5mBdzdzeqMmNDLYk_SWYiBIJdNT7oFOOelSWST79OFRp7omrvkqqO5r44dAVMpv3T5pgV6e2nltSdP-n_QX2hAdFag8vrGbkco1bisyHMUyx0O8I6JXMu9C6xyDrbwgAPfiJf8nlK7PJVYzgL2VOUSPQmoZekQJBgGs9oZsb1mDM6zcQZ0dbREo.KqyR7iA-HqWodH2tXWptupGqyDkGcJ1wqSfZj1il_nQ&dib_tag=se&keywords=mozzarella+per+pizza&qid=1714286706&sprefix=mozzare%2Caps%2C115&sr=8-10",
                #"https://www.amazon.it/Passata-pomodoro-vetro-Mutti-cartone/dp/B09JT1L18P/ref=sr_1_3?crid=215UVAXCMH621&dib=eyJ2IjoiMSJ9.XcufPe7nGvkWcVUSWjPNgEZpKl9NxuMA_qjs1rWcy2MP7l_C_HQVgTVicAebBJ4irRuDLg8PUBmd7oqHa-K_bQIBS3wgewJtYCORNgBCTi09zvnFTqrcDTqtXrrFaZJQbOrn9GZ-0S6JQga7TfUNo3c2pVuVeFx_f5L2y3hEoeD807m1ohfTMXaLZGOqXPKaeH-ll6X9nCLVaI2pViL7Djxe25deRW1zj-Er8uZ4KYqFqqLnCSgVXd8Xnas6guaAaz7OrSrYwbakERkiNjEatRs-4JsjBDyjFjizCdrmO6o.fISYDOKOZJrzmsVZUebDCulWZs8-5YtBxKWIVh6QV5w&dib_tag=se&keywords=pomodoro+mutti&qid=1714288485&sprefix=pomodoro+%2Caps%2C92&sr=8-3",
                "https://www.amazon.it/Calabrese-Valle-Crati-Condimenti-Bottiglie/dp/B081M6Y24Q/ref=sr_1_20?__mk_it_IT=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=1BS9YFSTOBUQM&dib=eyJ2IjoiMSJ9.gR3VrzQm2azxCS9X4X_pEZsc3_FehjXEVzcVQB2-FtRjXhBfrjFYyv33pQV-s__ENG85pnDDQhjVW82oRLw1TW58LgFspBgJ9fG1bjB3gAcKqpaCfTk4r4luFxbbpCWMqM2iwNqnr8lrT8iy36zdqXqaPuCYXA2I8pxTORNp9J8ZCeUx7zjfuuNBtviIl6IluYjvcgCe5pVlan6-BqlR5QL2wcAgXoqn96oKi7SMFeZPg0huRjZb_aCL0pBVmUFOWNyrVNtTQZLDNBxVJWN8FWmwN0Rw-LyMOXMvzOj-8xI.EMTmlgRjOBTuy95M02VaIErMj4IBtWBHuABjsPO8kBQ&dib_tag=se&keywords=bottiglia+pomodoro&qid=1714288621&sprefix=bottiglia+pomodoro%2Caps%2C101&sr=8-20")
for(urls in tutti_urls)
{
  testo <- ""
  
  for(url in urls)
  {   
    # Apri la pagina e aspetta che carica interamente
    driver$client$navigate(url)
    Sys.sleep(2) # 2 secondi, occhio
    
    # Cerca tag div che dice se l'ingrediente, materia prima risulta disponibile nel magazzino
    div <- try(driver$client$findElement(using = "id", value = "availability"))  
    #attenzione, il nome di quel "value" PUO' cambiare
    
    # SE la pagina non ha quel tag, assumi assenza in magazzino. Ipotesi forte
    if(class(div) == "try-error")
      next
    else
    {   
      # Ottieni testo da div tag
      testo <- div$getElementText()[[1]]
      break
    }
  }
  
  if(testo == "Disponibilità immediata") 
    #attenzione, testo può cambiare. Es. "Disponibilità 2" o comunque un numero
  {  
    
    aggiungi_al_carrello <- driver$client$findElement(using = "id", value = "add-to-cart-button")
    aggiungi_al_carrello$clickElement()
    
  }
  
  Sys.sleep(5)
  
}

### Parte delicata ----
# Le credenziali non vanno MAI digitate all'interno di un codice
# Esistono varie soluzioni per conservare segreti: Keyring, creare file specifici, etc.

# Vai alla pagina del carrello
driver$client$navigate("https://www.amazon.it/gp/cart/view.html?ref_=nav_cart")


# Trova bottone "Procedi all'ordine" 
prosegui_ordine <- driver$client$findElement(using = "name", value = "proceedToRetailCheckout")

# Clicca bottone precedente
prosegui_ordine$clickElement()

# Trova rettangolo inserimento nome utente
username_input <- driver$client$findElement(using = "id", value = "ap_email")

# Inserisci nome utente 
username_input$sendKeysToElement(list("SEGRETO_UTENTE")) #OCCHIO

# Invia nome utente
username_input$submitElement()


# Trova rettangolo inserimento password
password_input <- driver$client$findElement(using = "id", value = "ap_password")

# Inserisci password
password_input$sendKeysToElement(list("SEGRETO_PASSWORD")) #OCCHIO

# Invia password
password_input$submitElement()

# Aspetta il caricamento della password
Sys.sleep(2)

Tutto bello fino ad ora, eh? Sulla carta abbiamo un codice che riduce a manciate di secondi il processo di acquisto della segretaria o del responsabile acquisti. Sulla carta…a schermo… Peccato che abbiamo qualcosa di immutabile, il codice, che fa qualcosa su qualcosa di mutabile, il sito (o front-end) di Amazon. Se domani mattina qualcuno si alza, ad Amazon, e decide che disponibilità immediata diventa “Disponibile ora!”, quel codice NON funziona più. Stesso discorso se cambia leggermente il bottone “Aggiungi al carrello”. Bisogna anticipare quell’evento e avere l’accortezza di gestire quella che gli informatici chiamano eccezione: se il codice non va a buon fine, si può, ad esempio, mandare una mail al programmatore, titolare, etc. Pensa che qualche manager riceve premi di produzione perché riesce a far risparmiare all’azienda qualche soldino perché non fa inserire pezzi di codice del genere….. 

Quindi questo presunto sistema esperto o intelligenza artificiale d’acquisti non ha adattabilità a meno che il programmatore metta mano al codice. Esistono già sistemi più adattabili che integrano modelli statistici linguistici (LLM), ma questa toppa crea un altro buco. 

 

Torno sul punto 4 perché anche lì ci si può giocare la reputazione e la carriera: esistono delle buone pratiche per conservare dati sensibili, cosa che in passato ho chiamato camera dei segreti.

 

Vuoi scoprire se vale la pena automatizzare una serie di acquisti, in funzione delle ore-uomo/anno necessare? Sentiamoci in una chiamata gratuita

 

Puoi accedere al codice di sopra anche in formato diverso, da più da addetto ai lavori.

Privacy Policy
it_ITItalian