Կեյսեր/ Բաշխում/ Գնումներ

Գնումներ առանց անակնկալների՝ ինչ է գնորդը տեսնում ամեն առավոտ

Կադրային գնումներ բաշխիչի համար — երբ զրո մնացորդը դատարկ չէ

Մեկ էկրան, 700 SKU, համալրման դրոշներ։ Գնումների պարամետրերն ապրում են Google Sheets-ում՝ փոխեք մատակարարման ժամկետը կամ շեմը, սեղմեք «Թարմացնել»՝ մոդելը վերահաշվարկում է ամբողջ պորտֆելը։

Չմշակված տվյալները QuickBooks-ից՝ parquet-ով, մուտքերը՝ Google Sheets-ից, մոդելը՝ Power Pivot-ում 207 DAX-չափիչով։ Հասանելիության կադրը = փաստացի վաճառքի ժամանակահատվածը՝ վերադարձները չեն զրոյացնում այն, շեմից ցածր անկումները չեն հաշվվում։

Գնումներ · ավտո-հաշվարկ Կադրային մոտեցում ABC × ներբրենդ Google Sheets մուտքեր Power Pivot · DAX 700 SKU
Ոլորտ Պրոֆեսիոնալ կոսմետիկայի ներմուծում և մեծածախ բաշխում · Սրահներ, բաշխիչներ, մանրածախ, marketplace-ներ (Shopify · Amazon · Etsy · Walmart), կոնսիգնացիա · ~700 ակտիվ SKU
Ղեկի մոտ Գլխավոր էկրանը, որտեղ աչքը կանգ է առնում, ինչպես է թարմացվում տվյալը, ինչն է փոխվում ձեռքով։ Ինժեներական կողմը՝ վերևի աջ անկյունի փոխարկիչով։
Կապոտի տակ Ճարտարապետություն, կադրային մոտեցում, հիմնական DAX-չափիչներ։ Գնորդի աչքերով տեսնելու համար՝ վերևի աջ անկյունի փոխարկիչը։
SKU-պարամետրեր ~7000 ▲ մեկ Google Sheet
Ժամանակ՝ մեկ կանոնի ~2 ր ▼ էր շաբաթներ ERP-ով
Պակասուրդի բացեր ▲ վաղ ազդանշաններ
ABC-կտրվածքներ 2D ALL × ներբրենդ

01Ինչպես էր աշխատում մինչ մեզ

Մեծածախ ընկերության գնորդն անընդհատ քայլում է «չպահել՝ հաճախորդը գնում է» և «շատ պահել՝ գումարը սառչում է դարակում» միջև։ 700-SKU պորտֆելով և 1–3 ամիս մատակարարման ժամկետ կրող անդրսահմանյան լոգիստիկայով ամեն ուշացում վերածվում է կորած վաճառքի կամ թանկ «շտապ» վերապատվերի։

Մինչ մեր աշխատանքը՝

Ընկերությունը կոսմետիկայի ներմուծող և մեծածախ բաշխիչ է։ Վաճառքի ալիքները՝ սրահներ, բաշխիչներ, մանրածախ, marketplace-ներ (Shopify, Amazon, Etsy, Walmart), կոնսիգնացիա։ Պորտֆելը՝ ~700 ակտիվ SKU՝ երեք պահեստով և մի քանի հաշվով։ Խնդիրը «մնացորդ կա՞, թե՞ ոչ» չէր, այլ՝ ինչպես հաշվել պաշարը մեծածախի համար՝

02Ինչ կառուցեցինք

Գնումների գլխավոր էկրանը

Գնորդը բացում է մեկ ֆայլ։ Գլխավոր թերթն ունի ամեն ակտիվ SKU-ի աղյուսակ՝ «պատվիրել, թե ոչ» որոշման համար անհրաժեշտով։ Գույները՝ համալրման կարգավիճակ, թվերը՝ մանրամասներ։

Գնումներ · կարգավիճակ ըստ ապրանքի տվյալներ՝ 24 մայիսի դրությամբ · կադրն ավտո-վերահաշվարկ
~700 SKU արտադրությունում · այստեղ՝ 12 սինթետիկ ապրանք՝ ցուցադրման համար
Բրենդ
ABC ներբրենդ
Կարգավիճակ
SKU Բրենդ ABC Մնացորդ ԿՊ Օրական Միտում 30/(31–90) Օր մնաց Ճանապարհին Պատվիրել Կարգավիճակ

* SKU-ները սինթետիկ են։ ABC-գնահատականը ներբրենդ է։ Դասավորում՝ «Հրատապ» → «Հսկել» → «Նորմ», ներսում՝ ըստ նվազող հրատապության։

Գնորդը սկսում է «Հրատապ» ֆիլտրից՝ ապրանքներ, որոնց մնացորդը պակաս է մատակարարման ժամկետից։ Դրանք ստանում են որոշումներ առաջինը՝ գնի համաձայնեցում, պատվեր, հազվադեպ՝ էքսպրես-լոգիստիկա։ Հետո՝ «Հսկել»՝ սահմանային դեպքեր, որտեղ վաճառքի միտումը ռիսկի մասին է ազդարարում։

Կադրային տրամաբանությունը՝ պարզ բառերով

Ոչ ամեն մնացորդի անկում է նշանակում «վերջացած»։ Ոչ ամեն համալրում է նշանակում «նորից վաճառքում»։ Կադրային տրամաբանությունը երկու նրբությունն էլ մշակում է ինքնաշխատ։

SKU SKU-A01 · հասանելիության պատմությունը կենտրոնական պահեստում
պաշարում
անկում
պաշարում
վերադարձ
պաշարում
կադր 1
կադր 2 · վերադարձը չի զրոյացնում
հնվմրտմյսհլսսեպնյմ
Ակտիվ կադր · վաճառքն իրապես ընթանում է Անկում · զրո-շեմից ցածր, չի հաշվվում Գործընկերոջ վերադարձ · կադրը շարունակվում է

«Օրական վաճառք» չափիչում վերադարձը չի հաշվվում որպես նոր ժամանակահատվածի սկիզբ՝ հակառակ դեպքում այն թերագնահատում է իրական ինտենսիվությունը։ Շեմից ցածր անկումը չի հաշվվում որպես վաճառք (վաճառելու բան չկար)։ Հաշվառքն ավտոմատ է և նույնական բոլոր 700 SKU-ի համար՝ կարիք չկա առանձին «հիշել» կոնկրետ ապրանքի առանձնահատկությունները։

Պարամետրերը՝ Google Sheets-ում, ոչ կոդում

Գնումների հիմնական պարամետրերը ERP-ից տեղափոխվել են Google Sheets։ Մենեջերը բացում է թերթը, փոխում թիվը՝ և Excel-ում հաջորդ «Թարմացնել»-ի ժամանակ մոդելը վերահաշվարկում է փոխված պարամետրից կախված ամեն ինչ։

Google Sheets · գնումների պարամետրեր (հատված)
SKUԲրենդԺամկետ, օրԹիրախ-պաշար, օրԶրո-շեմԴրոշ-շեմ
SKU-A01[Բրենդ 1]9060520
SKU-A02[Բրենդ 1]7545315
SKU-B01[Բրենդ 2]120901040
SKU-C01[Բրենդ 3]6030210

Ինչ է ապրում այս թերթում՝

Փոխեցիք մատակարարին, ժամկետն այժմ 60 օր է 90-ի փոխարեն — բացեք Google Sheets, փոխեք մեկ թիվ։ Երկու րոպե անց մոդելը հաշվում է առաջարկություններ նոր տրամաբանությամբ։ Ոչ հաշվետվության վերամշակում, ոչ ERP-ծրագրավորող։

Ինչպես է թարմացվում տվյալը

QuickBooksօրական մնացորդ
parquetարտահանում
Excel՝ «Թարմացնել»+ GS մուտքեր
Թարմ կարգավիճակ700 SKU-ով

Առավոտյան ռեժիմը մեկ կոճակ սեղմելն է։ Զուգահեռ՝ գործընկերները կարող են ինչ-որ բան ուղղած լինել Google Sheets-ում (նոր մատակարար, թարմացված ժամկետ)՝ ամեն ինչ ներքաշվում է մեկ թարմացմամբ։

Ինչ դարձավ հնարավոր

Ճարտարապետություն

Տվյալների աղբյուրներ
Պահոց
Excel-մոդել
QuickBooks · մնացորդօրական կտրվածքներ՝ ըստ ի.անձ × SKU — ~973հզ տող
QuickBooks · վաճառքմանրամասն՝ ըստ ամսաթվի, հաճախորդի, ալիքի, ներկայացուցչի
QuickBooks · սպասվող PO-ներինչ և երբ է ժամանում պահեստ
Google Sheets (մուտքեր)ժամկետ · զրո-շեմ · դրոշ · թիրախ-պաշար · գներ
Ֆայլի թերթերՕրացույց · ի.անձ-փնտրումներ · սպասարկող աղյուսակներ
Parquet-աղյուսակներ արտահանված QuickBooks-ից
(պարբերական ETL)
Google Sheets → ուղիղ
Power Query
Power Query կարդալ parquet + GS · տիպերի նորմալացում
Power Pivot ~15 մոդելի աղյուսակ · 207 DAX-չափիչ

Առանցքային որոշումը՝ ERP-ից քաշել միայն չմշակված տվյալ (մնացորդ, վաճառք, PO), իսկ ամբողջ բիզնես-տրամաբանությունը հաշվել Excel-մոդելում DAX-ով։ Սա տալիս է երկու բան՝ կանոնները կարող են փոխվել առանց ERP-ծրագրավորողին անհանգստացնելու, և հաշվետվության կարգաբերումը վերցնում է րոպեներ, ոչ թե շաբաթներ։

Պաշարի կադրային մոտեցումը

Հիմնական հասկացությունը՝ հասանելիության կադրն է։ Սա այն ժամանակահատվածն է, որի ընթացքում ապրանքն իրապես վաճառվում էր (ոչ թե նստած էր վերադարձներում կամ շեմից ցածր)։ Օրական վաճառքը հաշվվում է միայն կադրերի ներսում։

Կադրային տրամաբանությունը ժամանակագծի վրա (սխեմատիկ)
պաշարում
անկում
պաշարում
վերադարձ
պաշարում
կադր 1
կադր 2
1 հնվ1 մրտ1 մյս1 հլս1 սեպ1 նյմ
Շեմից վեր · ակտիվ վաճառք Զրո-շեմից ցածր · կադրը չի աշխատում Վերադարձ · հաշվապահական ցատկ, ոչ նոր կադր

Կադրի պարամետրերը (կոնկրետ ամեն SKU-ի և պահեստի համար) ապրում են Google Sheets-ում՝

ՊարամետրԻնչ է անում
Զրո-շեմ ԿՊ-ում (հատ)Այս արժեքից ցածր մնացորդը համարվում է «բացակա»՝ կադրը չի աշխատում
Համալրման դրոշի շեմ (հատ)Գործարկում է «պատվիրելու կարիք» դրոշը՝ բայց չի զրոյացնում ընթացիկ կադրը
Մատակարարման ժամկետ, օրՊատվերից մինչ պահեստ ժամանումը միջին ժամանակը
Թիրախ-պաշար, օրՔանի օրվա հարմարավետ պաշար պահել մատակարարման ժամկետից վեր
Ինչո՞ւ պարամետրերը Google Sheets-ում, ոչ ERP-ում։ Բիզնեսն ունի 700+ SKU, և պարամետրերը փոխվում են. մատակարարը փոխվում է, և ժամկետն այժմ 60 օր է 90-ի փոխարեն, պրեմիում բրենդի համար զրո-շեմը բարձրանում է։ Դա ERP-ում փոխելը ծրագրավորողի տիկետ է։ GS-ում՝ երկու րոպե, և մոդելի հաջորդ թարմացմանը ամեն ինչ վերահաշվարկվում է։

Օրական վաճառք՝ սահող պատուհաններ

Բազային չափիչը վերջին 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 աղյուսակում՝

-- Ներբրենդ գնահատական (չափիչով, ոչ ուղիղ սյունակով —
-- որպեսզի արձագանքի համատեքստում դատարկ վաճառքին)
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 տարի
Գնումների մոդուլն առաջինն էր։ Կադրային մոտեցումը մշակվեց և վավերացվեց դրա վրա։ Դրանից հետո նույն ենթակառուցվածքը (Google Sheets որպես մուտք, parquet որպես աղբյուր, DAX-չափիչներ որպես տրամաբանություն) օգտագործվեց ամեն հաջորդ մոդուլի համար՝ գնագոյացում, վաճառք, մոտիվացիա։

Նմա՞ն խնդիր ունեք ձեր կողմում

Պատմեք՝ 30 րոպեում կպարզենք, թե ինչն է հնարավոր։

դիտման ռեժիմ