123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- // node --require regenerator-runtime/runtime --require ./babel-local search.js ..\out result.csv
- import {promises} from 'fs';
- import {resolve} from 'path';
- import {eachFormElement, eachItem, eachVestnik} from './lib/read';
- const {writeFile, truncate} = promises;
- async function work (prefix, outfile) {
- console.info(`Input directory: ${prefix}`);
- await truncate(outfile);
- console.info(`Output file: ${outfile}`);
- for await (let vestnik of eachVestnik(prefix)) {
- for (let item of eachItem(vestnik)) {
- const {id = '', url = "about:blank"} = item.zakazka && item.zakazka[0].$ || {};
- if (hasCpv("45", item)) {
- const v = oddiel_V(item);
- if (v) {
- processV(v, {
- id,
- url
- }, item, async items => await writeFile(outfile, poorMansCsv(items) + "\r\n", {flag: "a"}));
- }
- }
- }
- }
- }
- const formComponentIdEndsWith = (value, searchString) => value.$.FormComponentId && value.$.FormComponentId.endsWith(searchString);
- function processV ({value: oddielV, dive: diveV}, soFar, item, out) {
- let processed = false;
- for (let {tag, value, cancel, dive} of diveV()) {
- if (tag === "RepeatingPart" && formComponentIdEndsWith(value, "-partZmluva")) {
- cancel();
- processed = processed || processZmluva({value, dive}, soFar, item, out);
- }
- if (tag === "Part" && (formComponentIdEndsWith(value, "-zadanieZakazky")||formComponentIdEndsWith(value, "-partV_2"))) {
- cancel();
- processed = processed || processZadanie({value, dive}, soFar, item, out);
- }
- if (tag === "Part" && formComponentIdEndsWith(value, "-partV_1")) {
- cancel();
- const {id, url} = soFar;
- out([id, url, -1, 0, '-', 0, '-', 0]);
- processed = true;
- }
- }
- if (!processed) {
- const {id, url} = soFar;
- out([id, url, -1, '?', '?', '?', '?', 0]);
- }
- }
- function processZmluva ({value: zmluva, dive: diveZmluva}, {id, url}, item, out) {
- let pocetPonuk = 0;
- let predpokladanaCena = '?';
- let predpokladanaMena = '?';
- let konecnaCena = '?';
- let konecnaMena = '?';
- let vitazIco = 0;
- for (let {tag, value, cancel} of diveZmluva()) {
- if (tag === "ShortText") {
- if (formComponentIdEndsWith(value, "-pocetDorucenychPonuk") && value.$.Value) {
- pocetPonuk = +value.$.Value;
- }
- if ((formComponentIdEndsWith(value, "-MN03_zmluvaPredpokladanaHodnota") || formComponentIdEndsWith(value, "-NM06_cena")) && value.$.Value) {
- predpokladanaCena = value.$.Value
- }
- if (formComponentIdEndsWith(value, "-stCKHZ_Hodnota") && value.$.Value) {
- konecnaCena = value.$.Value
- }
- }
- if (tag === "DropDownList") {
- if ((formComponentIdEndsWith(value, "-zmluvaMenaOd") || formComponentIdEndsWith(value, "-zmluvaCenaMena")) && value.SelectListValue) {
- predpokladanaMena = value.SelectListValue[0].$.Code;
- }
- if ((formComponentIdEndsWith(value, "-zmluvaCenyMena") || formComponentIdEndsWith(value, "-zmluvaCenaMenaPonuky")) && value.SelectListValue) {
- konecnaMena = value.SelectListValue[0].$.Code;
- }
- }
- if (tag === "ContactSelectList" && formComponentIdEndsWith(value, "-zmluvaVitaz")) {
- cancel();
- vitazIco = (value.PersonData[0].CorporateBody[0].ICO||['?'])[0];
- }
- }
- if (pocetPonuk === 0) return false;
- out([id, url, pocetPonuk, predpokladanaCena, predpokladanaMena, konecnaCena, konecnaMena, vitazIco]);
- return true;
- }
- function processZadanie ({value: zmluva, dive: diveZmluva}, {id, url}, item, out) {
- let pocetPonuk = 0;
- let predpokladanaCena = '?';
- let predpokladanaMena = '?';
- let konecnaCena = '?';
- let konecnaMena = '?';
- let vitazIco = 0;
- for (let {tag, value, cancel} of diveZmluva()) {
- if (tag === "ShortText") {
- if (formComponentIdEndsWith(value, "-pocetPrijatychPonuk") && value.$.Value) {
- pocetPonuk = +value.$.Value;
- }
- if (formComponentIdEndsWith(value, "-prepokladanaHZ") && value.$.Value) {
- predpokladanaCena = value.$.Value
- }
- if (formComponentIdEndsWith(value, "-konecnaHZ") && value.$.Value) {
- konecnaCena = value.$.Value
- }
- }
- if (tag === "DropDownList") {
- if (formComponentIdEndsWith(value, "-menaHZ_SYNCHRONIZE") && value.SelectListValue) {
- predpokladanaMena = value.SelectListValue[0].$.Code;
- }
- if (formComponentIdEndsWith(value, "-menaHZ") && value.SelectListValue) {
- konecnaMena = value.SelectListValue[0].$.Code;
- }
- }
- if (tag === "ContactSelectList" && formComponentIdEndsWith(value, "-kontaktNaDodavatela_alt")) {
- cancel();
- vitazIco = (value.PersonData[0].CorporateBody[0].ICO||['?'])[0];
- }
- }
- if (pocetPonuk === 0) return false;
- out([id, url, pocetPonuk, predpokladanaCena, predpokladanaMena, konecnaCena, konecnaMena, vitazIco]);
- return true;
- }
- const poorMansCsv = items => JSON.stringify(items).slice(1, -1);
- function hasCpv (prefix, item) {
- for (let {tag, value, cancel} of eachFormElement(item)) {
- if (tag === "Part") {
- const match = value.$.Title && value.$.Title.match(/^ODDIEL\s+(\w+):/);
- if (match && match[1] !== "II") cancel();
- }
- if (tag === "Cpv" && value.$.Code.startsWith(prefix)) return true;
- if (tag === "SelectList" && value.$.Type === "CPV" && value.SelectListValue && value.SelectListValue[0].$.Title.startsWith(prefix)) return true;
- }
- return false;
- }
- function oddiel_V (item) {
- for (let {tag, value, cancel, dive} of eachFormElement(item)) {
- if (tag === "Part") {
- const match = value.$.Title && value.$.Title.match(/^ODDIEL\s+(\w+):/);
- if (match)
- if (match[1] === "V") return {value, dive}; else cancel();
- }
- }
- return null;
- }
- work(resolve(process.argv[2] || ''), resolve(process.argv[3] || 'result.csv'))
- .catch(error => console.error(error));
|