#include %cspBuild #include vhLib.Macro #include %occInclude #include Prod.Product #include BL.Derde.KlantSpecifiek #define NewRelease 0 #define MaxDiffPRS 2.00 // Oproepen via // d KSB^WV3(1) KSB(blnCheckOnly) New k Do KADCreateSchaduwBS(.blnCheckOnly) w !,!,"Merge array arLOG into a global (Y/N) ? " r k,! If $$$UCase(k)?1(1"Y",1"J") Do . Kill ^wvLogKADcalcSchaduwBS . Merge ^wvLogKADcalcSchaduwBS=arLOG . w "the array arLOG is merged to global ^wvLogKADcalcSchaduwBS ",! w !,!,"Show array arLOG in this terminal (Y/N) ? " r k,! If $$$UCase(k)'="N" Do . w $$ArrayToText^vhLib("arLOG(""I-ID"")",.arLOG),! . w $$ArrayToText^vhLib("arLOG(""PRS"")",.arLOG),! Quit // Oproepen via // d KSS^WV3() KSS(blnCheckOnly) New k Do KADStatsSchaduwBS() w !,!,"Merge array arSTAT into a global (Y/N) ? " r k,! If $$$UCase(k)?1(1"Y",1"J") Do . Kill ^wvLogKADstatSchaduwBS . Merge ^wvLogKADstatSchaduwBS=arSTAT . w "the array arSTAT is merged to global ^wvLogKADstatSchaduwBS ",! w !,!,"Show array arSTAT in this terminal (Y/N) ? " r k,! If $$$UCase(k)'="N" Do . w $$ArrayToText^vhLib("arSTAT(""I-ID"")",.arLOG),! . w $$ArrayToText^vhLib("arSTAT(""RAW"")",.arLOG),! . w $$ArrayToText^vhLib("arSTAT(""PRS"")",.arLOG),! Set Dev=$$OPEN^vhDEV(,"KAD_Stats_BSS.txt","W","T") Use Dev Set PRNr="" Write $tr("PRNr,KortTekst,KadID,blnNonAkt,blnKadExistsID,blnBSFixed,blnBS,blnBSS,blnKostSpeciaal,StatQty,VersieNrPRBS",",",$C(9)),! For Set PRNr=$O(arSTAT("RAW",PRNr)) Quit:PRNr="" Do . Write PRNr,*9,$P(^KPR(PRNr,0),"\") . Write *9,$$ListToPieces^vhLib(arSTAT("RAW",PRNr),$C(9)) . Write ! Do CLOSE^vhDEV(Dev) W !,"File "_"KAD_Stats_BSS.txt"_" written to disk",! Quit KADStatsSchaduwBS() // Routine kan best opgeroepen worden NA het uitvoeren van KADCreateSchaduwBS() // Loopt ^KPR af en maakt een lijst van alle Kaderdeuren die geen schaduwBouwstenen hebben of die speciale bouwstenen (bvb. VullingKostSpecial) bevatten New PRNr,KadID,GENTYP,CntProd,CntCalc New blnNonAkt,blnKadExistsID,blnBSFixed,blnBSS,blnKostSpeciaal,blnHist,VersieNrPRBS,StatQty Kill arSTAT Set (CntProd,CntCalc)=0 Set PRNr="" For Set PRNr=$O(^KPR(PRNr)) Quit:(PRNr="") Do:PRNr . Set KadID=$P($G(^KPR(PRNr,"G")),"\",13) . Quit:(+KadID'>0) . Set GENTYP=$P(##class(Prod.Product).GetPropViaNr(PRNr,"GENTYP"),"\",1) ; Geeft TBX, KAD, BAN, ... terug naargelang het product . Quit:(GENTYP'?1(1"KAD")) . Do kssStatSchaduwBS() ; (PRNr,KadID) w !,"Total Products: "_CntProd_" #Calc: "_CntCalc,! Quit kssStatSchaduwBS() ; (PRNr,KadID) Quit:($G(PRNr)'?4.7N) Quit:(($I(CntProd)#1)'=0) Do:$I(CntCalc) ; Increment CntCalc Do kssWriteOutput Set blnNonAkt=($$$PRGet($$$NONAktief)=1) Set blnKadExistsID=##class(Prod.GADef.KaderDeur).%ExistsId(KadID) Set VersieNrPRBS=$P($G(^PRBS("BS",PRNr),"\\1.0.0"),"\",3) Set blnBSFixed=(VersieNrPRBS="") Set blnBSS=($D(^PRBS("BSS",PRNr))=11) Set blnBS=($D(^PRBS("BS",PRNr))=11) Set blnKostSpeciaal=0 Set blnKostSpeciaal=(blnKostSpeciaal)||($LG(##class(Prod.Kenmerk.DataDefinitie).Get("KAD",PRNr,"PROFKS"),1)>0) ; Profiel KostSpeciaal Set blnKostSpeciaal=(blnKostSpeciaal)||($LG(##class(Prod.Kenmerk.DataDefinitie).Get("KAD",PRNr,"VULKS"),1)>0) ; Vulling KostSpeciaal Set blnKostSpeciaal=(blnKostSpeciaal)||($LG(##class(Prod.Kenmerk.DataDefinitie).Get("KAD",PRNr,"CONSKS"),1)>0) ; Constructie KostSpeciaal Set StatQty=$$PROD^STAT(PRNr,0,"2009.03 ","2010.03 ",1) Set arSTAT("I-ID",PRNr)=KadID Set arSTAT("RAW",PRNr)=$LB(KadID,blnNonAkt,blnKadExistsID,blnBSFixed,blnBS,blnBSS,blnKostSpeciaal,StatQty,VersieNrPRBS) ;Set arSTAT("PRS",PRNr)=$S($G(DummyPrice,0):$LB(999.99), 1:$LB($$$PRGet($$$PPLMTL))) ;Set $LI(arSTAT("PRS",PRNr),10)="KadID: "_KadID Quit kssWriteOutput // Write output to device Quit:(CntCalc#100'=0) ; Only write once every ? to device w "Product : "_$G(PRNr)_" - "_$G(KadID) w " - Calc..."_$G(CntProd)_" :"_$G(CntCalc),! Quit KADCreateSchaduwBS(blnCheckOnly) // Loopt alle KaderDeur objecten af en creëert de schaduw bouwstenen voor de bestaande KPR-producten New PRNr,KadID,CntProd,CntCalc New CheckKadID,KadObj,GADataProd,DummyPrice,MaxDiffPRS Set blnCheckOnly=$G(blnCheckOnly,1) Set MaxDiffPRS=100 Set (CntProd,CntCalc)=0 Quit:('$$kcsCheckSchaduwActief()) Kill arLOG w "Preparing SQL ... ",! &sql(DECLARE crsKadALL cursor for SELECT Product, ID INTO :PRNr, :KadID FROM Prod_GADef.KaderDeur WHERE (ID > 1000) ORDER BY Product) &sql(OPEN crsKadALL) w "Fetching SQL records ... ",! For &sql(FETCH crsKadALL) Quit:SQLCODE Do kcsCreateViaPRNr(.PRNr,.KadID,blnCheckOnly) &sql(CLOSE crsKadALL) w !,"Total Products: "_CntProd_" #Calc: "_CntCalc,! Quit kcsCheckSchaduwActief() #define KADBasis "KADBasis" Set Templ=##class(Prod.GAData.Template).TemplateViaCode($$$KADBasis) Quit:('$IsObject(Templ)) 0 ; "No Template object" Quit:('$IsObject(Templ.SchaduwProduct)) 0 ; "Geen schaduwproduct in de template aanwezig" Quit 1 kcsCreateViaPRNr(PRNr,KadID,blnCheckOnly) w:(blnCheckOnly) "Product : "_$G(PRNr)_" - "_$G(KadID) Quit:($G(PRNr)'?4.7N)||(+$G(KadID)'>0) Quit:('$D(^KPR(PRNr)))||($$$PRGet($$$NONAktief)=1) Set VersieNrPRBS=$P($G(^PRBS("BS",PRNr),"\\1.0.0"),"\",3) Quit:(VersieNrPRBS="") // Check Valid PRNr/KadID Set CheckKadID=$P($G(^KPR(PRNr,"G")),"\",13) ; Moet zelfde zijn als KadID Quit:('CheckKadID)||(KadID'=CheckKadID) Set GENTYP=$P(##class(Prod.Product).GetPropViaNr(PRNr,"GENTYP"),"\",1) ; Geeft TBX, KAD, BAN, ... terug naargelang het product Quit:(GENTYP'?1(1"KAD")) #if ($$$Server="CACHE01")||($$$NSpace="TST-ADMIN1") Quit:(($I(CntProd)#1)'=0) #else Quit:(($I(CntProd)#100)'=0) #endif w:(blnCheckOnly=0) "Product : "_$G(PRNr)_" - "_$G(KadID) w " - Calc..."_CntProd_" :"_$I(CntCalc),! Set arLOG("I-ID",PRNr)=KadID Set arLOG("PRS",PRNr)=$S($G(DummyPrice,0):$LB(999.99), 1:$LB($$$PRGet($$$PPLMTL))) Set $LI(arLOG("PRS",PRNr),10)="KadID: "_KadID Quit:(blnCheckOnly) ; Testcase - do not create schaduw Bouwstenen YET Set KadObj="" Set sc=##class(Prod.GADef.KaderDeur).KPRCreateSchaduwViaPRNr(PRNr, .KadObj) w sc,! /* * / // // !!! NOT TESTED YET !!! // If ($IsObject(KadObj))&&($IsObject(KadObj.GADataProd)) Do . // Get price from GADataProd . Set GADataProd=KadObj.GADataProd . Set $LI(arLOG("PRS",PRNr),3)=$J(GADataProd.Cumuls("KPrijs"),0,4) . Set $LI(arLOG("PRS",PRNr),5)=+$J($LI(arLOG("PRS",PRNr),3)-$LI(arLOG("PRS",PRNr),1),0,2) . ;Do:(MaxDiffPRS>0) TBXCheckMaxDiffPRS(PRNr, MaxDiffPRS, $LI(arLOG("PRS",PRNr),1), $LI(arLOG("PRS",PRNr),3), 0) /* */ Set KadObj="" Quit TBXCheckMaxDiffPRS(PRNr,MaxDiffPRS,Prs1,Prs2,SetNonAkt) Quit:(MaxDiffPRS'>0) If ($ZAbs(Prs2-Prs1)>MaxDiffPRS)&&(Prs1>0)&&(Prs2>0) Do . Do:($G(SetNonAkt)) $$$PRSet($$$NONAktief,1) . Set arLOG("ERR",PRNr,$I(arLOG("ERR",PRNr)))="Prijs Diff > "_$G(MaxDiffPRS)_" EUR : Product op NonAktief ("_($$$PRGet($$$NONAktief))_")" . Set $LI(arLOG("AKT",PRNr),1)="NonAkt="_$$$PRGet($$$NONAktief) Quit // Added: 29/10/2010 // Herberekenen van de Bouwstenen voor TBX-producten die "Verlaagde rug" bevatten. // Deze routine kan in drie stappen // Oproepen via: // d RecalcRSTL^WV3(1000,1) RecalcRSTL(KLNr,Stap) Do RecalcTBX^WV3(.KLNr,.Stap) Quit // Added: 21/09/2010 // Herberekenen van de Bouwstenen voor TBX-producten die "ZIF intivo" bevatten. // Deze routine kan in drie stappen // Oproepen via: // d RecalcZIF^WV3(1000,1) RecalcZIF(KLNr,Stap) Do RecalcTBX^WV3(.KLNr,.Stap) Quit // Added: 04/06/2010 // Herberekenen van de Bouwstenen voor TBX-producten die een ANTISLIPMAT bevatten. // Deze routine kan in drie stappen // Oproepen via: // d RecalcASM^WV3(1000,1) RecalcASM(KLNr,Stap) ;Do RecalcTBX^WV3(.KLNr,.Stap) Quit // Herberekenen van de Bouwstenen voor TBX-producten. // Deze routine kan in drie stappen RecalcTBX(KLNr,Stap) New ModOpties,blnModifyBS,blnModifyPrijs,CntProd Set KLNr=$G(KLNr,1000) ; $$$KlantTestKlant of gebruik "*" voor alle klanten Set Stap=$G(Stap,1) If Stap=1 Do ; Check Only : GetProducts . Set ModOpties="-" Else If Stap=2 Do ; Check Only : Recalc products without changes . Set blnModifyBS=0 . Set blnModifyPrijs=0 . Set ModOpties="-" Else If Stap=3 Do ; Recalc products and update BS . Set blnModifyBS=1 . Set blnModifyPrijs=0 . Set ModOpties="M;H" ; "M;H" (Modify HF) zal enkel de HF van "ZIF intivo" aanpassen .;Set ModOpties="H;P" ; "H;P" zal ook de prijzen aanpassen Else Do Quit . Write !,!,"!!! Ongeldige waarde voor Stap !!!",! d WLIP^vhDBG(97,"RecalcTBX started (Stap "_Stap_")") Kill arProd,arErrors Do GetProducts(.arProd,KLNr) Write ! Write:(Stap=1) "Continu with fase 2 : Restart this routine with param ""Stap=2"".",!,! Quit:(Stap<2) // Modify BS Do RecalcProducts(.arProd,ModOpties) Write ! Write:(Stap=2) "Bouwstenen zijn NIET aangepast! ",!,"Continu with fase 3 : Restart this routine with param ""Stap=3"".",!,! Quit:(Stap<3) Write "RecalcASM routine Finished.",! Quit CountProducts(arProd) ; arProd als .local doorgeven New PRNr,Counter Set Counter=0 Set PRNr=0 For Set PRNr=$O(arProd(PRNr)) Quit:(PRNr="") If $I(Counter) Quit Counter RecalcProducts(arProd,ModOpties) ; arProd als .local doorgeven New PRNr,Counter Set Counter=0 Set PRNr=0 For Set PRNr=$O(arProd(PRNr)) Quit:(PRNr="") Do . Quit:('$$rcpCheckGADataExists(PRNr)) . Set sc=##class(Prod.GAData.Product).KPRModify(PRNr,ModOpties,0) . Write $J($I(Counter),4)_"."_"KPRModify voor PRNr "_PRNr_" Result="_$$ParseStatus^vhLib(sc),! . Set:($$$ISERR(sc)) arErrors(Counter,PRNr)="KPRModify voor PRNr "_PRNr_" Result="_$$ParseStatus^vhLib(sc) // Display errors if any occured If $D(arErrors) Do . Write !,$$$ArrayTT2("arErrors",.arErrors),! Quit rcpCheckGADataExists(PRNr) New blnExists,Key Set GADataID=$P(^KPR(PRNr,"G"),"\",13) Set blnExists=##class(Prod.GAData.Product).%ExistsId(GADataID) Quit:(blnExists) 1 ; Else : no persistent object for GADataID Write !!,"Geen GAData Product gevonden voor PRNr"_PRNr_" (GADataID="_GADataID_"). ",! Read "Druk op een toets om verder te gaan ... ",Key Write !! Quit 0 GetProducts(arProd,KLNr) ; arProd als .local doorgeven New arProdExclude,iKLNr If KLNr?4.5N { Do GetProductsForKlant(.arProd,KLNr) } ElseIf KLNr="*" { // Products to exclude from recalculation ;For iKLNr=$$$KlantKeller Do GetProductsForKlant(.arProdExclude,iKLNr) // Loop through ^KPR Do GetProductsViaKPR(.arProd,.arProdExclude) } Else { Write !,!," !!! Value for KLNr is invalid. No recalc performed !!!",! Quit ; Exit Rtn } // Aantal producten te herberekenen? Set CntProd=$$CountProducts(.arProd) Write "Aantal : "_CntProd_" product(en) te herrekenen",! If CntProd<100 { Write ! Write $$$ArrayTT2("arProd",.arProd) } Else { Write "The array ""arProd"" will not be displayed (too many items)." } Write ! Quit GetProductsForKlant(arProd,KLNr) ; arProd als .local doorgeven New PRNr,PakketCode,PAKNr,OFFNr,OLNr Set PRNr=0 // Statistiek For Set PRNr=$O(^KSTKL(KLNr,PRNr)) Quit:PRNr="" Do . Do StoreOne(PRNr,"S",KLNr) // Pakket Set PakketCode="" For Set PakketCode=$O(^PAKKET("IK",KLNr,PakketCode)) Quit:PakketCode="" Do . Set PAKNr=^PAKKET("IK",KLNr,PakketCode) . Set PRNr="" . For Set PRNr=$O(^PAKKET("D",PAKNr,PRNr)) Quit:PRNr="" Do . . Quit:PRNr'?4.7N . . Do StoreOne(PRNr,"P",KLNr) // Offertes Set OFFNr="" For Set OFFNr=$O(^KOFKL(KLNr,"F",OFFNr)) Quit:OFFNr="" Do . Set OLNr=100 . For Set OLNr=$O(^KOFKL(KLNr,"F",OFFNr,OLNr)) Quit:OLNr="" Do . . Set PRNr=$P(^KOFKL(KLNr,"F",OFFNr,OLNr),"\",2) . . Quit:PRNr'?4.7N . . Do StoreOne(PRNr,"O",KLNr) Quit /// Alle producten aflopen, dus NIET klant-afhankelijk ! /// Om producten te skippen (bvb. van een bepaalde klant), de PRNr(s) doorgeven via arProdExclude. GetProductsViaKPR(arProd,arProdExclude) ; arProd en arProdExclude als .local doorgeven ; TEMP ;Do StoreOne(522750,"S",12486) ;Quit New PRNr,KLNr Set KLNr="*" Set PRNr=0 For Set PRNr=$O(^KPR(PRNr)) Quit:PRNr="" Do . Quit:($D(arProdExclude(PRNr))) . Do StoreOne(PRNr,"S",KLNr) Quit StoreOne(PRNr,From,KLNr) New KortTekst,ASM,KLAS,LD,LC,DS,blnAddPrd,VersieNrPRBS,Prijs,LadeInfo Quit:$D(arProd(PRNr)) ; reeds verwerkt Quit:$P($$GENTYP^HAD(PRNr),"\")'="TBX" Quit:$$$PRGet($$$NONAktief)=1 Set KortTekst=$$$PRGet($$$KortTekst) Quit:$E(KortTekst,1,3)="GEN" Quit:$E(KortTekst,1,3)="BBS" q:(PRNr'?1(1"518499",1"602028")) ; Verlaagde RugH ;q:(PRNr'?1(1"592163",1"592193")) ; ZIF intivo Set blnAddPrd=$$stoProductIsTBoxWithVerlaagdeRug(.LadeInfo) ; (Added by WimV on 29/10/2010) ;Set blnAddPrd=$$stoProductIsTBoxWithZIFintivo(.LadeInfo) ; (Added by WimV on 21/09/2010) ;Set blnAddPrd=$$stoProductIsTBoxWithASM(.LadeInfo) ; (Added by WimV on 04/06/2010) Quit:('blnAddPrd) Set VersieNrPRBS=$P($G(^PRBS("BS",PRNr),"\\1.0.0"),"\",3) ; Steeds controleren Quit:(VersieNrPRBS="") Set Prijs=$S(KLNr?4.5N:$$KLANTPR^KPRIJS(KLNr,PRNr), 1:$$$PRGet($$$PPLMTL) ) Set $P(Prijs,"\",16)=From Set $P(Prijs,"\",17)=$G(LadeInfo,"LadeInfo?") Set arProd(PRNr)=Prijs ;Do GetLO(PRNr,.LOAll,.arProd,From) Quit stoProductIsTBoxWithVerlaagdeRug(LadeInfo) ; LadeInfo als .local doorgeven // Beperken tot de TBox-producten met Verlaagde ruggen (met/zonder hoge sifonlades) New RSTL,KLAS,LC,DS,blnOK Set RSTL=$LG(##class(Prod.Kenmerk.DataDefinitie).Get("TBX",PRNr,"RSTL")) ; RugStuk verlaagd Quit:(RSTL'?1(1"M",1"B")) 0 // Selectie verder te beperken, wanneer slechts gedeeltelijke omschakeling naar nieuwe producten Set LC=$LG(##class(Prod.Kenmerk.DataDefinitie).Get("TBX",PRNr,"LC")) ; LadeCode Set KLAS=$LG(##class(Prod.Kenmerk.DataDefinitie).Get("TBX",PRNr,"KLAS")) ; Klasse Set DS=$LG(##class(Prod.Kenmerk.DataDefinitie).Get("TBX",PRNr,"DS")) ; Design Set blnOK=1 ; (KLAS'?1(1"SY")) ; bouwstenen van dit product herberekenen ? ;Quit:(KLAS?1(1"SP2")) 0 ; spoelbakken voorlopig effe skippen (Added by WimV on 04/06/2010) Set LadeInfo=RSTL_";"_LC_";"_DS_";" Quit blnOK stoProductIsTBoxWithZIFintivo(LadeInfo) ; LadeInfo als .local doorgeven // Beperken tot de TBox-producten met ZIF intivo (D of C - binnenlade) New DC,DS,RH,LC,LT,blnOK Set DC=$LG(##class(Prod.Kenmerk.DataDefinitie).Get("TBX",PRNr,"DC")) ; DesignCode Quit:(DC'="I") 0 Set LT=$LG(##class(Prod.Kenmerk.DataDefinitie).Get("TBX",PRNr,"LT")) ; FrontType (binnenlade) Quit:(LT'="B") 0 Set DS=$LG(##class(Prod.Kenmerk.DataDefinitie).Get("TBX",PRNr,"DS")) ; Design Set RH=$LG(##class(Prod.Kenmerk.DataDefinitie).Get("TBX",PRNr,"RH")) ; RugHoogte Set LC=$LG(##class(Prod.Kenmerk.DataDefinitie).Get("TBX",PRNr,"LC")) ; LadeCode ;d WL^vhDBG("DS: "_DS_" RH: "_RH) Quit:($$$Not((DS?1(1"WI",1"ZI",1"GI",1"II"))&&(RH?1(1"D",1"C")))) 0 // Selectie verder te beperken, wanneer slechts gedeeltelijke omschakeling naar nieuwe producten // Bijvoorbeeld : enkel de ZIFs op D-hoogte in zijdewit omzetten Set blnOK=$$$Not((DS?1(1"WI",1"ZI"))&&(RH?1(1"D"))) #If ($$$Server="CACHE02")&&($$$NSpace="DEV-ADMIN1") Set blnOK=((DS?1(1"II"))&&(RH?1(1"C"))) #EndIf Set LadeInfo=LC_";"_DS_";"_RH_";" d:(blnOK) WL^vhDBG("LadeInfo: "_LadeInfo) Quit blnOK stoProductIsTBoxWithASM(LadeInfo) ; LadeInfo als .local doorgeven // Beperken tot de TBox-producten met antislipmatten New ASM,KLAS,LD,LC,DS,blnOK Set ASM=$LG(##class(Prod.Kenmerk.DataDefinitie).Get("TBX",PRNr,"ASM")) ; Antislipmat Quit:(ASM'?1(1"G",1"Z",1"R",1"1")) 0 // Selectie verder te beperken, wanneer slechts gedeeltelijke omschakeling naar nieuwe producten Set LD=$LG(##class(Prod.Kenmerk.DataDefinitie).Get("TBX",PRNr,"LD")) ; LadeDiepte Set LC=$LG(##class(Prod.Kenmerk.DataDefinitie).Get("TBX",PRNr,"LC")) ; LadeCode Set KLAS=$LG(##class(Prod.Kenmerk.DataDefinitie).Get("TBX",PRNr,"KLAS")) ; Klasse Set DS=$LG(##class(Prod.Kenmerk.DataDefinitie).Get("TBX",PRNr,"DS")) ; Design ;Set blnOK=(ASM?1(1"G"))&&(LD>500) ; bouwstenen van dit product herberekenen ? CONDITIE hangt af welke matten (kleur/afmeting) omgezet worden naar AGO Set blnOK=(DS'?1(1"AS",1"AI")) ; bouwstenen van dit product herberekenen ? ;Quit:(KLAS?1(1"SP2")) 0 ; spoelbakken voorlopig effe skippen (Added by WimV on 04/06/2010) Set LadeInfo=ASM_";"_LD_";"_LC_";" Quit blnOK ;