Sconti per grandi quantitativi con Envision

Sconti per grandi quantitativi












Home » Risorse » Qui

Gli sconti per grandi quantitativi rappresentano una situazione in cui il margine unitario della merce varia a seconda della quantità di merce acquistata: solitamente, il prezzo unitario diminuisce all'aumentare delle quantità acquistate, al fine di offrire al cliente un incentivo ad acquistare di più. Quando un fornitore offre sconti per grandi quantitativi, l'incentivo economico consiste nell'acquistare quantità di merce adeguate per poter approfittare dello sconto. Envision offre ampio supporto per sfruttare al meglio gli sconti per grandi quantitativi: in questa pagina vedremo come elaborare un modello adatto, mantenendo come obiettivo finale l'ottimizzazione del magazzino.


Sconti per gradi quantitativi: rappresentazione in tabelle

Il modo più comune per rappresentare gli sconti per grandi quantitativi per una serie di prodotti è una tabella a 3 colonne:

  • la colonna Id identifica il prodotto;
  • la colonna MinQ indica la quantità minima necessaria per il prezzo unitario;
  • la colonna P indica il prezzo unitario di acquisto per ogni prodotto.

Quando si cerca un prodotto in particolare, le righe sono filtrate per quantità in ordine crescente, in modo che la tabella sia più pratica da leggere e che la portata dello sconto sia più chiara.

Questo tipo di rappresentazione tende a evidenziare prezzi unitari marginali negativi quando acquistare un'unità di prodotto in più può portare a un prezzo totale più basso.

Prendiamo a esempio il prodotto A, venduto a €1 per pezzo. Il prodotto A offre uno sconto per l'acquisto di 50 pezzi, con un prezzo unitario di €0,90 per pezzo. Acquistando 46 pezzi, il costo totale è di €46, mentre, acquistando 50 pezzi, il costo totale è di soli €45. In questo modo, non esiste incentivo economico per acquistare il prodotto in quantità da 46 a 49 pezzi, poiché è più conveniente acquistare 50 pezzi. Il prezzo unitario marginale del 50° pezzo è quindi di €-4.

I prezzi marginali negativi sono il risultato del modello applicato ai dati per gestire gli sconti per grandi quantitativi. Esistono modelli più elaborati, in grado di eliminare i prezzi marginali negativi, ma per il momento non verranno presi in considerazione.

Nell'analisi qui di seguito, partiremo dal presupposto che i dati sugli sconti possano essere recuperati da una tabella come quella appena descritta.

Funzione pricebrk()

In Envision, scopo della funzione pricebrk() è quello di trasformare dati in forma di tabella in una distribuzione che rappresenti il costo di acquisto marginale delle unità. La sintassi è:
// "Prices" è la tabella degli sconti
expect Prcs[Id, *] 
B = pricebrk(D, P, Prcs.MinQ, Prcs.P, Stk, StkP)
La funzione restituisce la distribuzione del prezzo unitario marginale di acquisto, ossia il prezzo da pagare per acquistare l'unità numero k. La funzione è piuttosto complessa: qui di seguito la spiegheremo quindi in dettaglio.

Gli argomenti sono i seguenti:
  • D (domanda) è una distribuzione utilizzata per scegliere un supporto (nel senso matematico del termine) per la distribuzione da restituire. I valori di questa distribuzione non sono utilizzati, ma la distribuzione restituita viene regolata per essere precisa almeno quanto la distribuzione D;
  • P (prezzo) è un numero, interpretato come prezzo unitario predefinito del prodotto. Il valore è utilizzato se non esiste uno sconto per una quantità minima di 1, perché lo sconto parte da un valore più elevato di 1 o perché per il prodotto non sono disponibili sconti;
  • Prcs.MinQ (prezzi, quantità minima) è la quantità minima a cui è possibile applicare lo sconto. Deve corrispondere a un numero intero uguale o superiore a 1. Non sono ammessi duplicati;
  • Prcs.P (prezzi, prezzo) è il prezzo unitario per la riga di sconto in questione. Viene applicato a tutte le unità acquistate, non solo quelle che superano la quantità minima per lo sconto (Prcs.MinQ). Deve essere una funzione decrescente di Prcs.MinQ;
  • Stk (scorte) sono le scorte disponibili per il prodotto. I valori diversi da zero indicano che, per raggiungere un determinato livello di scorte, sono necessarie meno unità: questo vuol dire che lo sconto per grandi quantitativi sarà più difficile da ottenere. L'argomento deve corrispondere a un numero intero e può essere omesso: in quest'ultimo caso, sarà necessario omettere anche l'argomento StkP. Quando l'argomento viene omesso, il valore predefinito che gli viene assegnato è zero;
  • StkP (prezzo scorte) è il prezzo unitario per le unità già in magazzino. L'argomento è opzionale: se omesso, gli viene attribuito di default il valore zero.

L'argomento P è un mero zucchero sintattico, che serve a gestire i casi in cui la tabella degli sconti comprende unicamente prodotti a cui è effettivamente associato uno sconto. Grazie a questo argomento, possiamo evitare di estendere la tabella Prcs per avere almeno una riga per prodotto.

Risoluzione di distribuzioni

Il primo argomento della funzione pricebrk() deve essere una distribuzione, poiché le distribuzioni in Envision non sono arbitrariamente precise. In Envision esistono infatti limiti pratici alla risoluzione di una distribuzione. Nel nostro caso, però, lo sconto applicato dal fornitore può andare dall'acquisto di 1 sola unità all'acquisto di 10 milioni di unità (ipotesi): la funzione pricebrk() utilizza allora la distribuzione Demand per restringere la risoluzione della distribuzione restituita all'intervallo di nostro interesse.

Envision, infatti, è concepito per evitare una logica di ottimizzazione delle scorte che suggerisca di acquistare 999 unità, quando lo sconto può essere ottenuto con l'acquisto di 1000 unità. Una situazione del genere potrebbe presentarsi se la distribuzione generata da Envision non fosse in grado di differenziare, a livello interno, i valori a 999 unità dai valori a 1000 unità. Passando una distribuzione alla funzione pricebrk(), Envision garantisce che uno scenario simile sia scongiurato, adattando la risoluzione della distribuzione restituita.

Spazio di ordine e spazio di magazzinaggio

La tabella degli sconti è redatta considerando gli ordini, quindi associando un prezzo unitario di acquisto a ognuna delle quantità acquistate. Tuttavia, l'ottimizzazione delle scorte segue una logica diversa, incentrata, appunto, sulle scorte: quando pensiamo se aggiungere +1 unità di scorte al magazzino, teniamo in considerazione le scorte già disponibili, ossia lo spazio di magazzino. La funzione pricebrk() traspone la rappresentazione degli sconti dalla logica originale, basata sull'ordine, alla logica dell'ottimizzazione delle scorte, basata sullo spazio di magazzino.

Per poter eseguire questa trasposizione, però, la funzione pricebrk() ha bisogno di due argomenti associati alle scorte, ossia il livello di scorte e il prezzo unitario delle scorte. Questi due argomenti sono utilizzati per spostare verso destra la distribuzione dei prezzi marginali per unità di scorte. Lo spostamento può essere eseguito con l'operatore consueto per gli spostamenti sulle distribuzioni (>>), ma, anche in questo caso, potrebbero verificarsi situazioni in cui anche una minima approssimazione può diventare problematica per le soglie di sconto. La funzione pricebrk() internalizza questi spostamenti in modo da aggirare le approssimazioni.

Costo marginale delle unità

La distribuzione restituita da pricebrk() rappresenta il costo marginale di acquisto per unità. Il segmento [1;Stk] è associato alle scorte disponibili e all'argomento StkP. Quindi, se B è la distribuzione restituita da pricebrk(), allora l'integrale int(B, Stk + 1, Stk + N) è il costo totale per l'acquisto di N unità oltre le unità già disponibili in magazzino.

Come ricordato prima, le tabelle degli sconti sono spesso associate a costi unitari marginali negativi (es. quando l'acquisto di una unità in più comporta un costo negativo). Le distribuzioni restituite da pricebrk() riflettono questa possibilità attraverso valori locali negativi, coerenti e derivati direttamente dal modello dati utilizzato per gli sconti.

Combinare sconti e rendimento delle scorte

La funzione di rendimento delle scorte calcola la distribuzione dei ritorni economici marginali per ogni unità di prodotto aggiuntiva tenuta a magazzino. In una sezione precedente, abbiamo visto come questa funzione può essere associata a variabili economiche che rappresentano il margine lordo, lo svantaggio per rottura di stock e i costi di mantenimento a magazzino. In quel caso, le variabili economiche erano rappresentate da semplici numeri. Quando si tratta di sconti per grandi quantitativi, però, anche le variabili economiche si modificano, insieme alle quantità ordinate. Queste modifiche possono essere elaborate facilmente attraverso le distribuzioni.
B = pricebrk(D, BuyP, Prcs.MinQ, Prcs.P, Stk, StkP)

// "M", "S" e "C" sono distribuzioni
M = SellPrice - B
S = -0.5 * (SellPrice - B)
C = -0.3 * B * mean(Leadtime) / 365

AM = 0.3
AC = 1 - 0.2 * mean(Leadtime) / 365

// moltiplicazione punto per punto per "RM", "RS" e "RC"
RM = stockrwd.m(D, AM) * M
RS = stockrwd.s(D) * S
RC = stockrwd.c(D, AC) * C
R = RM + RS + RC 
La differenza principale tra questo blocco di codice e quello originale, quando abbiamo introdotto la funzione di rendimento delle scorte, è in BuyP (prezzo d'acquisto). La colonna BuyP è trasformata in una distribuzione di sconti B alla riga 1 attraverso la funzione pricebrk(). Il resto dello script si limita ad applicare direttamente l'algebra delle distribuzioni, che esegue automaticamente le operazioni più complicate al posto nostro.

Alle righe 4-6, le variabili economiche vengono trasformate in distribuzioni. Quando a una distribuzione si somma una costante, il risultato dell'addizione è una distribuzione. Lo stesso vale anche per le sottrazioni. Qui sopra, M è il rendimento di margine per unità (ossia il margine marginale): poiché gli sconti offrono solitamente un prezzo unitario più basso man mano che le quantità acquistate aumentano, c'è da aspettarsi che la distribuzione M sia crescente.

Alle righe 12-14, le componenti delle funzioni di rendimento delle scorte sono associate alle distribuzioni economiche (invece che a semplici numeri), ma la sintassi rimane la stessa. Alla fine della fiera, si tratta di moltiplicazioni punto per punto tra distribuzioni. Infine, alla riga 15, il rendimento delle scorte finale viene calcolato esattamente come abbiamo fatto in precedenza.