Գնումներ առանց անակնկալների՝ ինչ է գնորդը տեսնում ամեն առավոտ
Կադրային գնումներ բաշխիչի համար — երբ զրո մնացորդը դատարկ չէ
Մեկ էկրան, 700 SKU, համալրման դրոշներ։ Գնումների պարամետրերն ապրում են Google Sheets-ում՝ փոխեք մատակարարման ժամկետը կամ շեմը, սեղմեք «Թարմացնել»՝ մոդելը վերահաշվարկում է ամբողջ պորտֆելը։
Չմշակված տվյալները QuickBooks-ից՝ parquet-ով, մուտքերը՝ Google Sheets-ից, մոդելը՝ Power Pivot-ում 207 DAX-չափիչով։ Հասանելիության կադրը = փաստացի վաճառքի ժամանակահատվածը՝ վերադարձները չեն զրոյացնում այն, շեմից ցածր անկումները չեն հաշվվում։
01Ինչպես էր աշխատում մինչ մեզ
Մեծածախ ընկերության գնորդն անընդհատ քայլում է «չպահել՝ հաճախորդը գնում է» և «շատ պահել՝ գումարը սառչում է դարակում» միջև։ 700-SKU պորտֆելով և 1–3 ամիս մատակարարման ժամկետ կրող անդրսահմանյան լոգիստիկայով ամեն ուշացում վերածվում է կորած վաճառքի կամ թանկ «շտապ» վերապատվերի։
Մինչ մեր աշխատանքը՝
- ERP-հաշվետվությունը ցույց էր տալիս այսօրվա մնացորդը։ Այն չէր պատասխանում՝ «ե՞րբ կվերջանա»՝ դա հաշվվում էր ձեռքով Excel-ում, բրենդ առ բրենդ։
- Գնումների պարամետրերը (մատակարարման ժամկետ, նվազ. պաշար) ապրում էին մենեջերի գլխում կամ անձնական աղյուսակում։ Մենեջերը հեռանում էր՝ տրամաբանությունը հեռանում էր նրա հետ։
- Գործընկերների վերադարձներն աղավաղում էին օրական միջինի վիճակագրությունը։ «Աչքաչափով» չի մասշտաբավորվում։
Ընկերությունը կոսմետիկայի ներմուծող և մեծածախ բաշխիչ է։ Վաճառքի ալիքները՝ սրահներ, բաշխիչներ, մանրածախ, marketplace-ներ (Shopify, Amazon, Etsy, Walmart), կոնսիգնացիա։ Պորտֆելը՝ ~700 ակտիվ SKU՝ երեք պահեստով և մի քանի հաշվով։ Խնդիրը «մնացորդ կա՞, թե՞ ոչ» չէր, այլ՝ ինչպես հաշվել պաշարը մեծածախի համար՝
- Պակասուրդի բացեր։ Մինչ թիմը նկատում էր, որ ապրանքը բացակայում է, վաճառքն արդեն կորած էր։ Շտապ պատվերով վերականգնումը նշանակում էր մի քանի հավելյալ շաբաթ՝ անդրսահմանյան լոգիստիկայի պատճառով։
- Կոշտ հաշվետվություն։ ERP-հաշվետվությունը կառուցվում է մեկ անգամ՝ ընդմիշտ։ Ղեկավարության նոր հարց՝ ձևը վերամշակելը դանդաղ է և թանկ։
- «Պակասը» զրոյի մասին չէ։ Մեծածախի համար ապրանքը «վերջացած» է, երբ ընկնում է հարմարավետ շեմից ցածր (օր.՝ նվազ. առաքումից ցածր)։ Տարբեր SKU-ների համար՝ տարբեր շեմ։
- Ոչ ամեն համալրում է նոր ժամանակահատված սկսում։ Եթե գործընկերը վերադարձրեց ապրանք՝ դա հաշվապահական իրադարձություն է, ոչ թե վաճառքի վերսկսում։ Այդ «համալրումից» օրական միջին հաշվելը փչացնում է հաշվարկը։
- ERP-ի կարգաբերում՝ դանդաղ և թանկ։ Բիզնես-տրամաբանության ամեն ճշգրտում ծրագրավորողի միջոցով՝ շաբաթներ և հաշիվ։
02Ինչ կառուցեցինք
Գնումների գլխավոր էկրանը
Գնորդը բացում է մեկ ֆայլ։ Գլխավոր թերթն ունի ամեն ակտիվ SKU-ի աղյուսակ՝ «պատվիրել, թե ոչ» որոշման համար անհրաժեշտով։ Գույները՝ համալրման կարգավիճակ, թվերը՝ մանրամասներ։
| SKU | Բրենդ | ABC | Մնացորդ ԿՊ | Օրական | Միտում 30/(31–90) | Օր մնաց | Ճանապարհին | Պատվիրել | Կարգավիճակ |
|---|
* SKU-ները սինթետիկ են։ ABC-գնահատականը ներբրենդ է։ Դասավորում՝ «Հրատապ» → «Հսկել» → «Նորմ», ներսում՝ ըստ նվազող հրատապության։
Գնորդը սկսում է «Հրատապ» ֆիլտրից՝ ապրանքներ, որոնց մնացորդը պակաս է մատակարարման ժամկետից։ Դրանք ստանում են որոշումներ առաջինը՝ գնի համաձայնեցում, պատվեր, հազվադեպ՝ էքսպրես-լոգիստիկա։ Հետո՝ «Հսկել»՝ սահմանային դեպքեր, որտեղ վաճառքի միտումը ռիսկի մասին է ազդարարում։
Կադրային տրամաբանությունը՝ պարզ բառերով
Ոչ ամեն մնացորդի անկում է նշանակում «վերջացած»։ Ոչ ամեն համալրում է նշանակում «նորից վաճառքում»։ Կադրային տրամաբանությունը երկու նրբությունն էլ մշակում է ինքնաշխատ։
«Օրական վաճառք» չափիչում վերադարձը չի հաշվվում որպես նոր ժամանակահատվածի սկիզբ՝ հակառակ դեպքում այն թերագնահատում է իրական ինտենսիվությունը։ Շեմից ցածր անկումը չի հաշվվում որպես վաճառք (վաճառելու բան չկար)։ Հաշվառքն ավտոմատ է և նույնական բոլոր 700 SKU-ի համար՝ կարիք չկա առանձին «հիշել» կոնկրետ ապրանքի առանձնահատկությունները։
Պարամետրերը՝ Google Sheets-ում, ոչ կոդում
Գնումների հիմնական պարամետրերը ERP-ից տեղափոխվել են Google Sheets։ Մենեջերը բացում է թերթը, փոխում թիվը՝ և Excel-ում հաջորդ «Թարմացնել»-ի ժամանակ մոդելը վերահաշվարկում է փոխված պարամետրից կախված ամեն ինչ։
| SKU | Բրենդ | Ժամկետ, օր | Թիրախ-պաշար, օր | Զրո-շեմ | Դրոշ-շեմ |
|---|---|---|---|---|---|
| SKU-A01 | [Բրենդ 1] | 90 | 60 | 5 | 20 |
| SKU-A02 | [Բրենդ 1] | 75 | 45 | 3 | 15 |
| SKU-B01 | [Բրենդ 2] | 120 | 90 | 10 | 40 |
| SKU-C01 | [Բրենդ 3] | 60 | 30 | 2 | 10 |
Ինչ է ապրում այս թերթում՝
- Մատակարարման ժամկետ — պատվերից մինչ ժամանումը բնորոշ ժամանակը։ Փոխվում է, երբ փոխվում է մատակարարը կամ ուղին։
- Թիրախ-պաշար — ժամանումից հետո հարմարավետ պաշարի թիրախ-օրերը։
- Զրո-շեմ — որ մնացորդից ցածր ապրանքը հաշվվում է «բացակա»՝ կադրային տրամաբանությունում։
- Համալրման դրոշի շեմ — որ մնացորդի մակարդակում է վառվում «դեղին» / «կարմիր»-ը։
Ինչպես է թարմացվում տվյալը
Առավոտյան ռեժիմը մեկ կոճակ սեղմելն է։ Զուգահեռ՝ գործընկերները կարող են ինչ-որ բան ուղղած լինել Google Sheets-ում (նոր մատակարար, թարմացված ժամկետ)՝ ամեն ինչ ներքաշվում է մեկ թարմացմամբ։
Ինչ դարձավ հնարավոր
- Պորտֆելի ամբողջական տեսանելիություն։ Ֆիլտրեք ըստ բրենդի, ABC-ի, կարգավիճակի՝ տեսեք ամբողջ կտրվածքն առանց զանգերի։
- Վաղ ազդանշան։ 30/(31–90) միտումը ընդգծում է արագացող ապրանքները՝ գնորդը տեսնում է ռիսկն, նախքան մնացորդն ընկնի շեմից ցածր։
- Հետևողականություն։ Կանոնները նույնական են ամեն SKU-ի համար՝ ոչ մի «այս ապրանքը միշտ առանձին է հաշվվում»։
- Փոխանցում։ Մենեջերը հեռանում է՝ պարամետրերը մնում են Google Sheets-ում։ Նոր մարդն առաջին օրվանից տեսնում է տրամաբանությունը։
Ճարտարապետություն
(պարբերական ETL) Google Sheets → ուղիղ
Power Query
Առանցքային որոշումը՝ ERP-ից քաշել միայն չմշակված տվյալ (մնացորդ, վաճառք, PO), իսկ ամբողջ բիզնես-տրամաբանությունը հաշվել Excel-մոդելում DAX-ով։ Սա տալիս է երկու բան՝ կանոնները կարող են փոխվել առանց ERP-ծրագրավորողին անհանգստացնելու, և հաշվետվության կարգաբերումը վերցնում է րոպեներ, ոչ թե շաբաթներ։
Պաշարի կադրային մոտեցումը
Հիմնական հասկացությունը՝ հասանելիության կադրն է։ Սա այն ժամանակահատվածն է, որի ընթացքում ապրանքն իրապես վաճառվում էր (ոչ թե նստած էր վերադարձներում կամ շեմից ցածր)։ Օրական վաճառքը հաշվվում է միայն կադրերի ներսում։
Կադրի պարամետրերը (կոնկրետ ամեն SKU-ի և պահեստի համար) ապրում են Google Sheets-ում՝
| Պարամետր | Ինչ է անում |
|---|---|
Զրո-շեմ ԿՊ-ում (հատ) | Այս արժեքից ցածր մնացորդը համարվում է «բացակա»՝ կադրը չի աշխատում |
Համալրման դրոշի շեմ (հատ) | Գործարկում է «պատվիրելու կարիք» դրոշը՝ բայց չի զրոյացնում ընթացիկ կադրը |
Մատակարարման ժամկետ, օր | Պատվերից մինչ պահեստ ժամանումը միջին ժամանակը |
Թիրախ-պաշար, օր | Քանի օրվա հարմարավետ պաշար պահել մատակարարման ժամկետից վեր |
Օրական վաճառք՝ սահող պատուհաններ
Բազային չափիչը վերջին 30 օրվա վաճառքն է՝ ինքնաշխատ «աջ եզրով»՝ կա՛մ ընթացիկ օրացուցային համատեքստը, կա՛մ վաճառքի վերջին փաստացի ամսաթիվը (արդիական է, եթե ֆայլը բացվում է այլ օրը)՝
-- Units Sold (last 30 days) VAR BaseDate = IF( ISFILTERED('Calendar'[Date]) || ISCROSSFILTERED('Calendar'), MAX('Calendar'[Date]), MAX('Sales'[Date]) ) RETURN CALCULATE( [Units Sold], DATESINPERIOD('Calendar'[Date], BaseDate, -30, DAY) )
Զուգահեռ հաշվվում է միտում չափիչը՝ վերջին 30 օրվա հարաբերությունը 31–90 օր առաջ միջին ամսական ինտենսիվությանը։ Դա անմիջապես ցույց է տալիս՝ ապրանքն արագանո՞ւմ է, դանդաղո՞ւմ, թե՞ կայուն է։
-- Վաճառքի դինամիկա՝ (30օր) / (միջին ամիս 31-90օր պատուհանում) IF( [Units Sold (last 30 days)] && [Units Sold (avg month over 30-90 window)], [Units Sold (last 30 days)] / [Units Sold (avg month over 30-90 window)] - 1 )
Գնորդը տեսնում է ոչ միայն «քանի օրվա պաշար է մնացել», այլև «ուր է գնում ապրանքը»։ Դա փոխում է առաջնահերթությունները՝ արագացող ապրանք՝ փոքր բուֆերով՝ պատվիրել առաջինը, դանդաղող՝ մեծ բուֆերով՝ կարող է սպասել։
Մնացորդը «ճիշտ» ամսաթվին, ըստ ի.անձի
Նրբությունը, որ կոտրում է միամիտ չափիչները՝ օրական մնացորդը պահվում է որպես կտրվածքներ կոնկրետ ամսաթվերին, բայց ոչ ամեն SKU-ն ունի գրառում ամեն օրվա համար։ Պետք է վերջին հայտնի ամսաթիվը՝ ըստ SKU-ի, առանձին կենտրոնական պահեստի համար՝
-- Բացարձակ մնացորդ, ԿՊ (կենտրոնական պահեստ) VAR LastDate1 = CALCULATE( MAX('Stock'[Date]), ALLEXCEPT('Stock', 'Stock'[Item.SKU]), 'Stock'[Entity] = "[Կենտրոնական ՊՀ]" ) VAR Result = CALCULATE( SUM('Stock'[Qty]), 'Stock'[Date] = LastDate1, 'Stock'[Entity] = "[Կենտրոնական ՊՀ]" ) RETURN Result
Ընդհանուր պատկերի համար (բոլոր պահեստները)՝ այլ ձևանմուշ՝ SUMX SUMMARIZE-ի վրա՝ ըստ ի.անձի և SKU-ի, ներսում LASTDATE-ով։ Ամեն «ի.անձ × SKU» համադրություն ստանում է իր վերջին գրառումը՝
-- Ժամանակահատվածի վերջի մնացորդ (ագրեգատ՝ ըստ պահեստների) SUMX( SUMMARIZE('Stock', 'Stock'[Entity], 'Stock'[Item.SKU]), CALCULATE( SUM('Stock'[Qty]), LASTDATE('Stock'[Date]), 'Stock'[Qty] <> BLANK() ) )
Ծածկույթի օրեր և առաջարկություն
Մնացորդն ու օրական վաճառքը ձեռքին՝ հաշվում ենք պարզ, բայց տեղեկատվական ցուցանիշ՝
-- Ծածկույթի ամիսներ DIVIDE( [End-of-period stock], [Units Sold (last 30 days)], "infinity" )
Պատվերի քանակի առաջարկությունը հավաքվում է երեք բաղադրիչից՝
| Բաղադրիչ | Որտեղից |
|---|---|
| Սպառում մատակարարման ժամկետում | օրական վաճառք × Մատակարարման ժամկետ, օր |
| Թիրախ-պաշար ժամանումից հետո | օրական վաճառք × Թիրախ-պաշար, օր |
| Հանած՝ ինչն արդեն այստեղ է և ճանապարհին | ընթացիկ մնացորդ + սպասվող PO-ներ |
Եթե արդյունքը բացասական է՝ պատվեր պետք չէ։ Եթե դրական է՝ դա «չմշակված» առաջարկություն է, որը մենեջերը խաչաձև ստուգում է ABC-դասի և միտում-չափիչի հետ։
ABC-վերլուծություն՝ երկչափ
Մոդելը պահում է ABC-դասակարգման երկու տարբերակ՝ նախապես հաշվված (ETL-փուլում) և տեղադրված ABC ALL աղյուսակում՝
- ALL — դասակարգում ամբողջ պորտֆելով։ Օգտակար է ընդհանուր վարկանիշի և գնումների առաջնահերթության համար։
- InBrand — դասակարգում բրենդի ներսում։ Օգտակար է կոնկրետ բրենդ գնահատելու համար. նույնիսկ B-դասի ապրանքը կարող է «աշխատաձի» լինել նեղ գծի ներսում։
-- Ներբրենդ գնահատական (չափիչով, ոչ ուղիղ սյունակով — -- որպեսզի արձագանքի համատեքստում դատարկ վաճառքին) IF([Units Sold], SUM('ABC ALL'[Percentage InBrand]) )
Գնորդն առաջինը նայում է հատումները՝ A ALL-ով և A InBrand-ով՝ զրո մնացորդով՝ ապրանք, որտեղ կորուստն անմիջապես տեսանելի է։
Մուտքերը Google Sheets-ից
Մեկ Google Sheet — երկու դեպք։ Նույն թերթը, որ պահում է կադրի պարամետրերը (ժամկետ, շեմեր, թիրախ-պաշար), պահում է նաև գնագոյացման պարամետրերը (RRP, մեծածախ, գնի տեսակներ)։ Power Query-ն այն քաշում է որպես սովորական աղյուսակ՝
-- Գներ GS-ից (պարզեցված) let Source = Csv.Document( Web.Contents("https://docs.google.com/spreadsheets/d/.../export?format=csv&gid=..."), [Delimiter=",", Encoding=65001, QuoteStyle=QuoteStyle.Csv]), Header = Table.PromoteHeaders(Source), Types = Table.TransformColumnTypes(Header, { {"Item.SKU", type text}, {"Lead time, days", Int64.Type}, {"Zero threshold CW", Int64.Type}, {"Flag threshold", Int64.Type}, {"Target stock, days", Int64.Type} }) in Types
DAX-չափիչներում պարամետրերը ներքաշվում են LOOKUPVALUE-ով կամ ֆակտ-աղյուսակների հետ կապերով՝ ըստ SKU-ի։ Արժեքը փոխվում է GS-ում՝ հաջորդ «Թարմացնել»-ի ժամանակ այն հասնում է մոդել և վերահաշվարկում դրանից կախված ամեն ինչ։
03Ժամանակացույց և արդյունք
| Փուլ | Մեկնարկից |
|---|---|
| Աղբյուրների աուդիտ, կադրային մոտեցման համաձայնեցում | Մեկնարկ |
| Գնումների MVP՝ մնացորդ, վաճառք, բազային ABC | ~2 ամիս |
| Google Sheets-ի միացում բոլոր պարամետրերի համար | +1 ամիս |
| Ծայրից ծայր անալիտիկա, պլանավորում | 5–6 ամիս |
| Վաճառքի թիմի մոտիվացիան ERP-արտահանումներից | ~1 տարի |
Նմա՞ն խնդիր ունեք ձեր կողմում
Պատմեք՝ 30 րոպեում կպարզենք, թե ինչն է հնարավոր։
