<%@language = "javascript" %> <% /* $Revision$ $Id$ File: bes_klantmon_search_list.asp Description: Vangt de parameters van bes_klantmon_search op en verwerkt die tot een lijst Parameters: Context: Vanuit bes_klantmon_search.asp Note: KOPIE VAN bes_assmon_search_list.asp MOET zich beperken tot het assortiment van de gekozen klant (is die verplicht?) neemt dan ook de weging mee in bes_bedrijf_srtprod TODO, nu nog gewoon de kopie BES_BEDRIJF_SRTPROD: deze klant (bedrijf) bestelt per periode WEGING keer SRTPROD Het aantal regels in het overzicht moet gelijk zijn aan het aantal records voor die klant in BES_BEDRIJF_SRTPROD BES_BEDRIJF_SRTPROD --> BES_SRTPROD -->BES_SRTDEEL(artikel) -->Leverancier Als een leverancier een bepaald product niet kan leveren worden allerlei totalen niet meer getoond omdat niet te vergelijken is */ %> <% var klant_key = getQParamInt("klant_key"); // verplicht var searchtext = getQParam("searchtext", null); var disc_key = getQParamInt("disc", -1); var srtgroep_keys = getQParamIntArray("srtgroep", []); var lev_keys = getQParamIntArray("lev_keys", []); var huidigfact = getQParam("huidigfact", "off") == "on"; var bes_peildat1 = getQParamDate("bes_peildat1"); var bes_peildat2 = getQParamDate("bes_peildat2", null); var matchonly = getQParam("matchonly", "off") == "on"; // Alleen producten met weegfactor var compleetonly = getQParam("compleetonly", "off") == "on"; // *iedereen* moet hem leveren wil je eigenlijk var pctkolom = getQParam("pctkolom", "off") == "on"; var brutokolom = getQParam("brutokolom", "off") == "on"; var prijspeil = getQParam("prijspeil", "off") == "on"; var outputmode = getQParamInt("outputmode", 0); // 0 = screen, 1 = print, 2 = excel etc var showall = getQParamInt("showall", 0) == 1; var authparams = user.checkAutorisation("WEB_BESMSU"); %>
<% FCLTHeader.Generate({outputmode: outputmode}); %>
<% var lev_sql = // horizontaal "SELECT prs_bedrijf_key," + " prs_bedrijf_naam" + " FROM prs_bedrijf bedr" + " WHERE" if (lev_keys.length) lev_sql += " bedr.prs_bedrijf_key IN (" + lev_keys.join(",") + ")" else lev_sql += " bedr.prs_bedrijf_key IN (SELECT prs_bedrijf_key FROM bes_srtdeel)" lev_sql += " ORDER BY bedr.prs_bedrijf_naam_upper"; var lRs = Oracle.Execute(lev_sql); var leveranciers = {}; while (!lRs.Eof) { //leveranciers.push({ key: oRs("prs_bedrijf_key").Value, naam: oRs("prs_bedrijf_naam").Value }); leveranciers[lRs("prs_bedrijf_key").Value] = lRs("prs_bedrijf_naam").Value; lRs.MoveNext(); } // Als 'huidigfact' aanstaat dan tonen we percentueel verschil t.o.v. de originele klant-factuur // Als die niet aanstaat (mogelijk niet beschikbaar) dan tonen we het verschil t.o.v. het gemiddelde // van alle leveranciers. Je moet toch wat. var sql = "SELECT bes_srtprod_key," // vertikaal + " bes_bedrijf_srtprod_key," + " bes_bedrijf_srtprod_weging," + " bes_bedrijf_srtprod_prijs," + " bes_srtgroep_omschrijving," + " bes_srtprod_omschrijving," +(huidigfact?" bes_bedrijf_srtprod_weging * bes_bedrijf_srtprod_prijs gemiddeld," :" bes_bedrijf_srtprod_weging * AVG ( prijs ) gemiddeld,") + " bes.getsrtprodprijs (bes_srtprod_key, "+bes_peildat1.toSQL()+") pprijs"; if (bes_peildat2) { sql += ", bes.getsrtprodprijs (bes_srtprod_key, "+bes_peildat2.toSQL()+") pprijs2," +(huidigfact?" bes_bedrijf_srtprod_weging * bes_bedrijf_srtprod_prijs gemiddeld2" :" bes_bedrijf_srtprod_weging * AVG ( prijs2 ) gemiddeld2"); } var all_needed = []; // voor compleetonly for (lev_key in leveranciers) { all_needed.push(" Lev" + lev_key + " IS NOT NULL"); if (bes_peildat2) all_needed.push(" Lev2_" + lev_key + " IS NOT NULL"); sql += ", MAX (DECODE (prs_bedrijf_key, " + lev_key + ", prijs, NULL)) Lev" + lev_key; if (bes_peildat2) sql += ", MAX (DECODE (prs_bedrijf_key, " + lev_key + ", prijs2, NULL)) Lev2_" + lev_key; sql += ", MAX (DECODE (prs_bedrijf_key, " + lev_key + ", bes_srtdeel_omschrijving, NULL)) Oms" + lev_key; // tooltip sql += ", MAX (DECODE (prs_bedrijf_key, " + lev_key + ", bes_srtdeel_key, NULL)) deel" + lev_key; // onclick } sql += " FROM (SELECT bsp.bes_srtprod_key," + " bes_bedrijf_srtprod_key," + " bes_bedrijf_srtprod_weging," + " bes_bedrijf_srtprod_prijs," + " bsp.bes_srtprod_omschrijving," + " bsg.bes_srtgroep_omschrijving," + " bsd.bes_srtdeel_omschrijving," + " bes.getsrtdeelprijs (bsd.bes_srtdeel_key, "+bes_peildat1.toSQL()+") prijs," if (bes_peildat2) { sql += " bes.getsrtdeelprijs (bsd.bes_srtdeel_key, "+bes_peildat2.toSQL()+") prijs2,"; } var outer = matchonly?"":"(+)"; sql += " bsd.bes_srtdeel_key," + " bsd.prs_bedrijf_key" + " FROM bes_bedrijf_srtprod bbsp," + " bes_srtprod bsp," + " bes_srtdeel bsd," + " bes_srtgroep bsg" + " WHERE bbsp.bes_srtprod_key"+outer+" = bsp.bes_srtprod_key" + " AND bsp.bes_srtprod_key = bsd.bes_srtprod_key" + " AND bbsp.prs_bedrijf_key"+outer+" = " + klant_key + (srtgroep_keys.length>1 || srtgroep_keys[0]>-1 ? " AND bsg.bes_srtgroep_key IN (" + srtgroep_keys.join(",") + ")" : "") + (disc_key>0 ? " AND bsg.ins_discipline_key = " + disc_key : "") + (searchtext?" AND (UPPER(bsp.bes_srtprod_nr) LIKE " + safe.quoted_sql_wild(searchtext + "%") + " OR " + " UPPER(bsp.bes_srtprod_omschrijving) LIKE " + safe.quoted_sql_wild("%"+searchtext + "%") + ")" :"") + " AND bsg.bes_srtgroep_key = bsp.bes_srtgroep_key" + " )" + " GROUP BY bes_srtprod_key," + " bes_bedrijf_srtprod_key," + " bes_bedrijf_srtprod_weging," + " bes_bedrijf_srtprod_prijs," + " bes_srtprod_omschrijving," + " bes_srtgroep_omschrijving" + " ORDER BY bes_srtgroep_omschrijving, " + " bes_srtprod_omschrijving," + " bes_srtprod_key"; if (compleetonly&&all_needed.length) sql = "SELECT * FROM (" + sql + ") WHERE "+all_needed.join(" AND "); /* SELECT bes_srtprod_key, MAX (DECODE (prs_bedrijf_key, 46741, prijs, NULL)) Lev46741, MAX (DECODE (prs_bedrijf_key, 456, prijs, NULL)) Lev456, MAX (DECODE (prs_bedrijf_key, 789, prijs, NULL)) Lev789 FROM (SELECT bsp.bes_srtprod_key, bsd.prs_bedrijf_key, bes.getsrtdeelprijs (bsd.bes_srtdeel_key, NULL) prijs FROM bes_srtprod bsp, bes_srtdeel bsd WHERE bsp.bes_srtprod_key = bsd.bes_srtprod_key) GROUP BY bes_srtprod_key; */ function displaypercent(val1, val2) { if ( val1 && val2 && val1 != val2 ) { var diff = 100*(val2 - val1) / val1; var stl = diff<0?"besprijsdown":"besprijsup"; return ""+(diff>0?"+":"")+safe.displayfloat(diff)+""; } else return "-"; } function fnPrijsverschilP(oRs) { return displaypercent(oRs("pprijs").value, oRs("pprijs2").value); } function fnBrutoGewogen(oRs) { return safe.curr(oRs("pprijs").Value * oRs("bes_bedrijf_srtprod_weging").Value); } function fnHuidigFact(oRs) { return safe.curr(oRs("bes_bedrijf_srtprod_prijs").Value * oRs("bes_bedrijf_srtprod_weging").Value); } function fnBruto2Gewogen(oRs) { return safe.curr(oRs("pprijs2").Value * oRs("bes_bedrijf_srtprod_weging").Value); } function fnfnPrijsverschilL(lev_key) { return function (oRs) { var pkol1 = "lev" + lev_key; var pkol2 = "lev2_" + lev_key; return displaypercent(oRs(pkol1).value, oRs(pkol2).value); } } function fnfnLevPrijs(lev_key) { return function (oRs) { return safe.displayfloat(oRs("lev" + lev_key).Value); } } // Toon gewogen prijs function fnfnLevGewogenPrijs(lev_key) { return function (oRs) { if (oRs("lev" + lev_key).Value == null) return "XXX"; // niet in assortiment var gewogen = oRs("lev" + lev_key).Value * oRs("bes_bedrijf_srtprod_weging").Value; return safe.displayfloat(gewogen); } } // Toon prijspeil (afwijking t.o.v. gemiddelde) function fnfnLevPrijsPeil(lev_key) { return function (oRs) { if (oRs("lev" + lev_key).Value == null) return ""; // niet in assortiment var p1 = oRs("gemiddeld").Value; var p2 = oRs("bes_bedrijf_srtprod_weging").Value * oRs("lev" + lev_key).Value; return displaypercent(p1, p2); } } function fnfnLevPrijs2Peil(lev_key) { return function (oRs) { if (oRs("lev2_" + lev_key).Value == null) return ""; // niet in assortiment var p1 = oRs("gemiddeld2").Value; var p2 = oRs("bes_bedrijf_srtprod_weging").Value * oRs("lev2_" + lev_key).Value; return displaypercent(p1, p2); } } function fnfnLevPrijs2(lev_key) { return function (oRs) { return safe.displayfloat(oRs("lev2_" + lev_key).Value); } } function fnfnLev2GewogenPrijs(lev_key) { return function (oRs) { var p2 = oRs("lev2_" + lev_key).Value; if (p2 == null) return "XXX"; // niet in assortiment var gewogen = p2 * oRs("bes_bedrijf_srtprod_weging").Value; var stl = ""; if (!pctkolom) { var p1 = oRs("lev" + lev_key).Value; if (p1 != null) { diff = p2 - p1; if (Math.abs(diff) > 0.005) var stl = "class='"+(diff<0?"besprijsdown":"besprijsup") + "'"; } } var html = "" + safe.displayfloat(gewogen) + ""; return html; } } // Wordt voor elke regel één keer aangeroepen var leverancierTotal = {}; function fntotalCalc(oRs) { for (lev_key in leveranciers) { if (!leverancierTotal[lev_key]) leverancierTotal[lev_key] = { aantal: 0, som: 0, aantal2: 0, som2: 0 }; if (oRs("lev" + lev_key).Value != null) { var gewogen = oRs("lev" + lev_key).Value * oRs("bes_bedrijf_srtprod_weging").Value; leverancierTotal[lev_key].aantal ++; leverancierTotal[lev_key].som += gewogen; if (bes_peildat2 && oRs("lev2_" + lev_key).Value != null) { var gewogen = oRs("lev2_" + lev_key).Value * oRs("bes_bedrijf_srtprod_weging").Value; leverancierTotal[lev_key].aantal2 ++; leverancierTotal[lev_key].som2 += gewogen; } } } } // Wordt voor elke kolom één keer aangeroepen aan het einde // we krijgen de oorspronkelijke column mee en autodetecteren aan de hand van colmode // colmode=1 normale prijs, 2=2e prijs, 3=prijsverschil datums, 4=prijsverschil ander klanten function fntotalShow(column, nrlines) { switch (column.colmode) { case 1: var nn = leverancierTotal[column.lev_key].aantal; var ss = leverancierTotal[column.lev_key].som; break; case 2: var nn = leverancierTotal[column.lev_key].aantal2; var ss = leverancierTotal[column.lev_key].som2; break; case 3: if (leverancierTotal[column.lev_key].aantal != nrlines || leverancierTotal[column.lev_key].aantal2 != nrlines) return ""; // Niet compleet var p1 = leverancierTotal[column.lev_key].som; var p2 = leverancierTotal[column.lev_key].som2; return displaypercent(p1, p2); break; case 4: if (leverancierTotal[column.lev_key].aantal != nrlines) return ""; // Niet compleet var lev_key; var som = 0; var nn = 0; for (lev_key in leveranciers) { if (leverancierTotal[lev_key].aantal == nrlines) { nn ++ ; som += leverancierTotal[lev_key].som; } } return displaypercent(som/nn, leverancierTotal[column.lev_key].som); break; case 5: if (leverancierTotal[column.lev_key].aantal2 != nrlines) return ""; // Niet compleet var lev_key; var som = 0; var nn = 0; for (lev_key in leveranciers) { if (leverancierTotal[lev_key].aantal2 == nrlines) { nn ++ ; som += leverancierTotal[lev_key].som2; } } return displaypercent(som/nn, leverancierTotal[column.lev_key].som2); break; } if (nn == nrlines) return safe.curr(ss); else // incompleet return "" + Math.floor(nn/nrlines * 100) + "%"; } var rst = new ResultsetTable({ sql: sql, keyColumn: "bes_srtprod_key", ID: "assortimenttable", showAll: showall, outputmode: outputmode, totalShow: fntotalShow, totalCalc: fntotalCalc, title: L("lcl_bes_assortiment_list") }); rst.addColumn(new Column({caption: L("lcl_bes_srtgroup"), content: "bes_srtgroep_omschrijving"})); rst.addColumn(new Column({caption: L("lcl_bes_srtprod"), content: "bes_srtprod_omschrijving"})); rst.addColumn(new Column({caption: L("lcl_bes_weging"), content: "bes_bedrijf_srtprod_weging", datatype: "number"})); if (huidigfact) rst.addColumn(new Column({caption: L("lcl_bes_huidigfact"), content: fnHuidigFact, datatype: "currency"})); if (brutokolom) { rst.addColumn(new Column({caption: "", content: "pprijs", datatype: "currency"})); rst.addColumn(new Column({caption: L("lcl_bes_srtprod_prijs_prijs")+(bes_peildat2?L("lcl_bes_peildatum1_suf"):""), content: fnBrutoGewogen, datatype: "currency"})); if (bes_peildat2) { rst.addColumn(new Column({caption: "", content: "pprijs2", datatype: "currency"})); rst.addColumn(new Column({caption: L("lcl_bes_srtprod_prijs_prijs")+L("lcl_bes_peildatum2_suf"), content: fnBruto2Gewogen, datatype: "currency"})); if (pctkolom) { rst.addColumn(new Column({caption: L("lcl_bes_verschil_percentage"), content: fnPrijsverschilP, datatype: "currency"})); } } } for (lev_key in leveranciers) { rst.addColumn(new Column({caption: safe.html(leveranciers[lev_key]) + (bes_peildat2? L("lcl_bes_peildatum1_suf") : ""), datatype: "currency", content: fnfnLevGewogenPrijs(lev_key), total: true, colmode: 1, // normale prijs lev_key: lev_key, tooltip: fnfnLevPrijs(lev_key) })); if (prijspeil) { rst.addColumn(new Column({caption: safe.html(leveranciers[lev_key]) + (bes_peildat2? L("lcl_bes_peildatum1_suf") : "") + '
L("lcl_tov_avg")', datatype: "currency", content: fnfnLevPrijsPeil(lev_key), total: true, colmode: 4, // Gemiddelde over totaal lev_key: lev_key, tooltip: "gemiddeld" })); } if (bes_peildat2) { rst.addColumn(new Column({caption: safe.html(leveranciers[lev_key]) + L("lcl_bes_peildatum2_suf"), datatype: "currency", content: fnfnLev2GewogenPrijs(lev_key), total: true, colmode: 2, // alternatieve prijs lev_key: lev_key, tooltip: fnfnLevPrijs2(lev_key) })); if (prijspeil) { rst.addColumn(new Column({caption: safe.html(leveranciers[lev_key]) + L("lcl_bes_peildatum2_suf") + '
L("lcl_tov_avg2")', datatype: "currency", content: fnfnLevPrijs2Peil(lev_key), total: true, colmode: 5, // Gemiddelde over totaal lev_key: lev_key, tooltip: "gemiddeld" })); } if (pctkolom) { rst.addColumn(new Column({caption: L("lcl_bes_verschil_percentage")+ '
L("lcl_tov_datum1")', content: fnfnPrijsverschilL(lev_key), total: true, colmode: 3, // totaal prijs lev_key: lev_key })); } } } rst.addAction({ action: "weeg_edit", caption: L("lcl_edit"), isDefault: true}); rst.addAction({ action: "weeg_edit_multi", caption: L("lcl_bes_weging"), multi: true, multiOnce: true, single: false }); var cnt = rst.processResultset(); %>