refactor work
This commit is contained in:
		
							parent
							
								
									a8a14dda2b
								
							
						
					
					
						commit
						9e381f7d78
					
				
							
								
								
									
										204
									
								
								index.js
									
									
									
									
									
								
							
							
						
						
									
										204
									
								
								index.js
									
									
									
									
									
								
							@ -33,130 +33,14 @@ var Postgres = new pg.Client({
 | 
				
			|||||||
});
 | 
					});
 | 
				
			||||||
Postgres.connect();
 | 
					Postgres.connect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//------------create a callable sql exec func that return first rows----------------
 | 
					
 | 
				
			||||||
Postgres.FirstRow = function(inSQL, args, inResponse) {
 | 
					const SQLTemplate = (inSql, inJSON) => {
 | 
				
			||||||
    Postgres.query(inSQL, args, (err, res) => {
 | 
					    for (key in inJSON) {
 | 
				
			||||||
        if (err === null) {
 | 
					        inSql = inSql.replace(new RegExp(key, 'g'), inJSON[key]);
 | 
				
			||||||
            //need to test if the response is an object or an array
 | 
					    }
 | 
				
			||||||
            //inResponse.json(res.rows[0]);
 | 
					    return inSql;
 | 
				
			||||||
            if (Array.isArray(res)) {
 | 
					 | 
				
			||||||
                inResponse.json(res[1].rows[0]);
 | 
					 | 
				
			||||||
            } 
 | 
					 | 
				
			||||||
            else {
 | 
					 | 
				
			||||||
                inResponse.json(res.rows[0]);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        console.log(err.stack);
 | 
					 | 
				
			||||||
        inResponse.json(err.stack);
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					const build_where = (req, c, w, d, args) => {
 | 
				
			||||||
//------------route to test if the process is running-------------------------------
 | 
					 | 
				
			||||||
server.get('/', (req, res) => res.send('pivotscale api is running'))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//------------build forecast baseline that is a mirror of the target period---------
 | 
					 | 
				
			||||||
server.get('/baseline', bodyParser.json(), function(req, res) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    var sql = "";
 | 
					 | 
				
			||||||
    var path = './routes/baseline/baseline.sql';
 | 
					 | 
				
			||||||
    var args = [];
 | 
					 | 
				
			||||||
   
 | 
					 | 
				
			||||||
    var app_req                      =  JSON.stringify(req.body);
 | 
					 | 
				
			||||||
    var app_baseline_from_date =        req.body.app_baseline_from_date;
 | 
					 | 
				
			||||||
    var app_baseline_to_date =          req.body.app_baseline_to_date;
 | 
					 | 
				
			||||||
    var app_first_forecast_date =       req.body.app_first_forecast_date;
 | 
					 | 
				
			||||||
    var app_openorder_cutoff =          req.body.app_openorder_cutoff;
 | 
					 | 
				
			||||||
    var app_plug_fromdate =             req.body.app_plug_fromdate;
 | 
					 | 
				
			||||||
    var app_plug_todate =               req.body.app_plug_todate;
 | 
					 | 
				
			||||||
    var app_openstatus_code =           req.body.app_openstatus_code;
 | 
					 | 
				
			||||||
    var app_forecast_name =             req.body.app_forecast_name;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    var callback = function(arg) {
 | 
					 | 
				
			||||||
        sql = arg;
 | 
					 | 
				
			||||||
        console.log(new Date().toISOString() + "-------------------------baseline build-----------------------------")
 | 
					 | 
				
			||||||
        console.log(req.body);
 | 
					 | 
				
			||||||
        //parse the where clause into the main sql statement
 | 
					 | 
				
			||||||
        //sql = sql.replace(new RegExp("where_clause", 'g'), w)
 | 
					 | 
				
			||||||
        sql = sql.replace(new RegExp("app_req", 'g'),                   app_req);
 | 
					 | 
				
			||||||
        sql = sql.replace(new RegExp("app_baseline_from_date", 'g'),    app_baseline_from_date);
 | 
					 | 
				
			||||||
        sql = sql.replace(new RegExp("app_baseline_to_date", 'g'),      app_baseline_to_date);
 | 
					 | 
				
			||||||
        sql = sql.replace(new RegExp("app_first_forecast_date", 'g'),   app_first_forecast_date);
 | 
					 | 
				
			||||||
        sql = sql.replace(new RegExp("app_openorder_cutoff", 'g'),      app_openorder_cutoff);
 | 
					 | 
				
			||||||
        sql = sql.replace(new RegExp("app_openstatus_code", 'g'),       app_openstatus_code);
 | 
					 | 
				
			||||||
        sql = sql.replace(new RegExp("app_plug_fromdate", 'g'),         app_plug_fromdate);
 | 
					 | 
				
			||||||
        sql = sql.replace(new RegExp("app_plug_todate", 'g'),           app_plug_todate);
 | 
					 | 
				
			||||||
        sql = sql.replace(new RegExp("app_forecast_name", 'g'),         app_forecast_name);
 | 
					 | 
				
			||||||
        //execute the sql and send the result
 | 
					 | 
				
			||||||
        args.push(req.body.app_baseline_from_date);
 | 
					 | 
				
			||||||
        console.log(sql);
 | 
					 | 
				
			||||||
        //res.send(sql); 
 | 
					 | 
				
			||||||
        Postgres.FirstRow(sql, [], res)
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    fs.readFile(path, 'utf8', function(err, data) {
 | 
					 | 
				
			||||||
        if (!err) {
 | 
					 | 
				
			||||||
            callback(data);
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            console.log("fatal error pulling sql file")
 | 
					 | 
				
			||||||
            callback(err);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//------------scale a selected slice by the specified amounts-----------------------
 | 
					 | 
				
			||||||
server.get('/scale', bodyParser.json(), function(req, res) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    var sql = "";
 | 
					 | 
				
			||||||
    var w = ""; //holds the where
 | 
					 | 
				
			||||||
    var c = 1;  //flag if body is empty
 | 
					 | 
				
			||||||
    var d = 1;
 | 
					 | 
				
			||||||
    var path = './routes/scale/scale.sql';
 | 
					 | 
				
			||||||
    var args = [];
 | 
					 | 
				
			||||||
   
 | 
					 | 
				
			||||||
    var app_pincr    =  req.body.app_pincr;
 | 
					 | 
				
			||||||
    var app_req      =  JSON.stringify(req.body);
 | 
					 | 
				
			||||||
    var app_vincr    =  req.body.app_vincr;
 | 
					 | 
				
			||||||
    var app_forecast_name = req.body.app_forecast_name;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    var callback = function(arg) {
 | 
					 | 
				
			||||||
        sql = arg;
 | 
					 | 
				
			||||||
        ({ c, w, d } = build_where(req, c, w, d, args));
 | 
					 | 
				
			||||||
        //if there was no body sent, return with nothing
 | 
					 | 
				
			||||||
        //if (c == 1) {
 | 
					 | 
				
			||||||
        //    res.send("no body was sent");
 | 
					 | 
				
			||||||
        //    return;
 | 
					 | 
				
			||||||
        //}
 | 
					 | 
				
			||||||
        console.log(new Date().toISOString() + "-------------------------scale type adjustment----------------------")
 | 
					 | 
				
			||||||
        console.log(JSON.stringify(req.body));
 | 
					 | 
				
			||||||
        //parse the where clause into the main sql statement
 | 
					 | 
				
			||||||
        //sql = sql.replace(new RegExp("where_clause", 'g'), w)
 | 
					 | 
				
			||||||
        //sql = sql.replace(new RegExp("app_pincr", 'g'),    app_pincr);
 | 
					 | 
				
			||||||
        sql = sql.replace(new RegExp("app_req", 'g'),      app_req);
 | 
					 | 
				
			||||||
        sql = sql.replace(new RegExp("app_forecast_name", 'g'),         app_forecast_name);
 | 
					 | 
				
			||||||
        //sql = sql.replace(new RegExp("app_vincr", 'g'),    app_vincr);
 | 
					 | 
				
			||||||
        sql = sql.replace(new RegExp("app_where", 'g'),    w);
 | 
					 | 
				
			||||||
        //execute the sql and send the result
 | 
					 | 
				
			||||||
        args.push(req.body.app_baseline_from_date);
 | 
					 | 
				
			||||||
        console.log(sql);
 | 
					 | 
				
			||||||
        //send only the sql as the result of the route for debug
 | 
					 | 
				
			||||||
        //res.send(sql); 
 | 
					 | 
				
			||||||
        Postgres.FirstRow(sql, [], res)
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    fs.readFile(path, 'utf8', function(err, data) {
 | 
					 | 
				
			||||||
        if (!err) {
 | 
					 | 
				
			||||||
            callback(data);
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            console.log("fatal error pulling sql file")
 | 
					 | 
				
			||||||
            callback(err);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function build_where(req, c, w, d, args) {
 | 
					 | 
				
			||||||
    //loop through each top level item expected to be a simple key/value list reflecting the column and the target value
 | 
					    //loop through each top level item expected to be a simple key/value list reflecting the column and the target value
 | 
				
			||||||
    // "part":"XFRM500", "customer":"Sanford and Son" --> SQL -->     part = 'XFRM500'
 | 
					    // "part":"XFRM500", "customer":"Sanford and Son" --> SQL -->     part = 'XFRM500'
 | 
				
			||||||
    //                                                            AND customer = 'Sanford and Son'
 | 
					    //                                                            AND customer = 'Sanford and Son'
 | 
				
			||||||
@ -167,7 +51,7 @@ function build_where(req, c, w, d, args) {
 | 
				
			|||||||
        if (c > 1) {
 | 
					        if (c > 1) {
 | 
				
			||||||
            w = w +
 | 
					            w = w +
 | 
				
			||||||
                `
 | 
					                `
 | 
				
			||||||
            AND `;
 | 
					    AND `;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Array.isArray(req.body.app_scenario[i])) {
 | 
					        if (Array.isArray(req.body.app_scenario[i])) {
 | 
				
			||||||
            //if the scenario key has a value that is an array of items, push it into an `IN` statement
 | 
					            //if the scenario key has a value that is an array of items, push it into an `IN` statement
 | 
				
			||||||
@ -189,3 +73,75 @@ function build_where(req, c, w, d, args) {
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
    return { c, w, d };
 | 
					    return { c, w, d };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//------------route to test if the process is running-------------------------------
 | 
				
			||||||
 | 
					server.get('/', (req, res) => res.send('pivotscale api is running'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//------------build forecast baseline that is a mirror of the target period---------
 | 
				
			||||||
 | 
					server.get('/baseline', bodyParser.json(), function(req, res) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var sql = "";
 | 
				
			||||||
 | 
					    var path = './routes/baseline/baseline.sql';
 | 
				
			||||||
 | 
					    var args = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fs.readFile(path, 'utf8', function(err, fileContents) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (err) {
 | 
				
			||||||
 | 
					            console.log("fatal error pulling sql file");
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        console.log(new Date().toISOString() + "-------------------------baseline build-----------------------------")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        sql = SQLTemplate(fileContents, {
 | 
				
			||||||
 | 
					            ...req.body,
 | 
				
			||||||
 | 
					            app_req: JSON.stringify(req.body)
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Postgres.query(sql, []).then((result, error) => {
 | 
				
			||||||
 | 
					            res.json(result[1].rows[0]);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//------------scale a selected slice by the specified amounts-----------------------
 | 
				
			||||||
 | 
					server.get('/scale', bodyParser.json(), function(req, res) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var sql = "";
 | 
				
			||||||
 | 
					    var w = ""; //holds the where
 | 
				
			||||||
 | 
					    var c = 1; //flag if body is empty
 | 
				
			||||||
 | 
					    var d = 1;
 | 
				
			||||||
 | 
					    var path = './routes/scale/scale.sql';
 | 
				
			||||||
 | 
					    var args = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fs.readFile(path, 'utf8', function(err, data) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (err) {
 | 
				
			||||||
 | 
					            console.log("fatal error pulling sql file")
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let { check, where } = build_where(req, c, w, d, args);
 | 
				
			||||||
 | 
					        //if there was no body sent, return with nothing
 | 
				
			||||||
 | 
					        //if (c == 1) {
 | 
				
			||||||
 | 
					        //    res.send("no body was sent");
 | 
				
			||||||
 | 
					        //    return;
 | 
				
			||||||
 | 
					        //}
 | 
				
			||||||
 | 
					        console.log(new Date().toISOString() + "-------------------------scale type adjustment----------------------")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let sql = SQLTemplate(data, {
 | 
				
			||||||
 | 
					            app_req: JSON.stringify(req.body),
 | 
				
			||||||
 | 
					            app_forecast_name: req.body.app_forecast_name,
 | 
				
			||||||
 | 
					            app_where: where
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //execute the sql and send the result
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Postgres.query(sql, []).then((result, error) => {
 | 
				
			||||||
 | 
					            res.json(result.rows[0]);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
							
								
								
									
										894
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										894
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@ -1,897 +1,8 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "nodet",
 | 
					  "name": "nodet",
 | 
				
			||||||
  "version": "1.0.0",
 | 
					  "version": "1.0.0",
 | 
				
			||||||
  "lockfileVersion": 2,
 | 
					  "lockfileVersion": 1,
 | 
				
			||||||
  "requires": true,
 | 
					  "requires": true,
 | 
				
			||||||
  "packages": {
 | 
					 | 
				
			||||||
    "": {
 | 
					 | 
				
			||||||
      "name": "nodet",
 | 
					 | 
				
			||||||
      "version": "1.0.0",
 | 
					 | 
				
			||||||
      "license": "ISC",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "body-parser": "^1.19.0",
 | 
					 | 
				
			||||||
        "dotenv": "^8.2.0",
 | 
					 | 
				
			||||||
        "express": "^4.17.1",
 | 
					 | 
				
			||||||
        "fs": "0.0.1-security",
 | 
					 | 
				
			||||||
        "https": "^1.0.0",
 | 
					 | 
				
			||||||
        "pg": "^8.5.1",
 | 
					 | 
				
			||||||
        "readline": "^1.3.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/accepts": {
 | 
					 | 
				
			||||||
      "version": "1.3.8",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "mime-types": "~2.1.34",
 | 
					 | 
				
			||||||
        "negotiator": "0.6.3"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.6"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/array-flatten": {
 | 
					 | 
				
			||||||
      "version": "1.1.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/body-parser": {
 | 
					 | 
				
			||||||
      "version": "1.20.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "bytes": "3.1.2",
 | 
					 | 
				
			||||||
        "content-type": "~1.0.4",
 | 
					 | 
				
			||||||
        "debug": "2.6.9",
 | 
					 | 
				
			||||||
        "depd": "2.0.0",
 | 
					 | 
				
			||||||
        "destroy": "1.2.0",
 | 
					 | 
				
			||||||
        "http-errors": "2.0.0",
 | 
					 | 
				
			||||||
        "iconv-lite": "0.4.24",
 | 
					 | 
				
			||||||
        "on-finished": "2.4.1",
 | 
					 | 
				
			||||||
        "qs": "6.10.3",
 | 
					 | 
				
			||||||
        "raw-body": "2.5.1",
 | 
					 | 
				
			||||||
        "type-is": "~1.6.18",
 | 
					 | 
				
			||||||
        "unpipe": "1.0.0"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.8",
 | 
					 | 
				
			||||||
        "npm": "1.2.8000 || >= 1.4.16"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/buffer-writer": {
 | 
					 | 
				
			||||||
      "version": "2.0.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=4"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/bytes": {
 | 
					 | 
				
			||||||
      "version": "3.1.2",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.8"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/call-bind": {
 | 
					 | 
				
			||||||
      "version": "1.0.2",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "function-bind": "^1.1.1",
 | 
					 | 
				
			||||||
        "get-intrinsic": "^1.0.2"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "funding": {
 | 
					 | 
				
			||||||
        "url": "https://github.com/sponsors/ljharb"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/content-disposition": {
 | 
					 | 
				
			||||||
      "version": "0.5.4",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "safe-buffer": "5.2.1"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.6"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/content-type": {
 | 
					 | 
				
			||||||
      "version": "1.0.4",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.6"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/cookie": {
 | 
					 | 
				
			||||||
      "version": "0.4.2",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.6"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/cookie-signature": {
 | 
					 | 
				
			||||||
      "version": "1.0.6",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/debug": {
 | 
					 | 
				
			||||||
      "version": "2.6.9",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "ms": "2.0.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/depd": {
 | 
					 | 
				
			||||||
      "version": "2.0.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.8"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/destroy": {
 | 
					 | 
				
			||||||
      "version": "1.2.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.8",
 | 
					 | 
				
			||||||
        "npm": "1.2.8000 || >= 1.4.16"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/dotenv": {
 | 
					 | 
				
			||||||
      "version": "8.6.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=10"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/ee-first": {
 | 
					 | 
				
			||||||
      "version": "1.1.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/encodeurl": {
 | 
					 | 
				
			||||||
      "version": "1.0.2",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.8"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/escape-html": {
 | 
					 | 
				
			||||||
      "version": "1.0.3",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/etag": {
 | 
					 | 
				
			||||||
      "version": "1.8.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.6"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/express": {
 | 
					 | 
				
			||||||
      "version": "4.17.3",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "accepts": "~1.3.8",
 | 
					 | 
				
			||||||
        "array-flatten": "1.1.1",
 | 
					 | 
				
			||||||
        "body-parser": "1.19.2",
 | 
					 | 
				
			||||||
        "content-disposition": "0.5.4",
 | 
					 | 
				
			||||||
        "content-type": "~1.0.4",
 | 
					 | 
				
			||||||
        "cookie": "0.4.2",
 | 
					 | 
				
			||||||
        "cookie-signature": "1.0.6",
 | 
					 | 
				
			||||||
        "debug": "2.6.9",
 | 
					 | 
				
			||||||
        "depd": "~1.1.2",
 | 
					 | 
				
			||||||
        "encodeurl": "~1.0.2",
 | 
					 | 
				
			||||||
        "escape-html": "~1.0.3",
 | 
					 | 
				
			||||||
        "etag": "~1.8.1",
 | 
					 | 
				
			||||||
        "finalhandler": "~1.1.2",
 | 
					 | 
				
			||||||
        "fresh": "0.5.2",
 | 
					 | 
				
			||||||
        "merge-descriptors": "1.0.1",
 | 
					 | 
				
			||||||
        "methods": "~1.1.2",
 | 
					 | 
				
			||||||
        "on-finished": "~2.3.0",
 | 
					 | 
				
			||||||
        "parseurl": "~1.3.3",
 | 
					 | 
				
			||||||
        "path-to-regexp": "0.1.7",
 | 
					 | 
				
			||||||
        "proxy-addr": "~2.0.7",
 | 
					 | 
				
			||||||
        "qs": "6.9.7",
 | 
					 | 
				
			||||||
        "range-parser": "~1.2.1",
 | 
					 | 
				
			||||||
        "safe-buffer": "5.2.1",
 | 
					 | 
				
			||||||
        "send": "0.17.2",
 | 
					 | 
				
			||||||
        "serve-static": "1.14.2",
 | 
					 | 
				
			||||||
        "setprototypeof": "1.2.0",
 | 
					 | 
				
			||||||
        "statuses": "~1.5.0",
 | 
					 | 
				
			||||||
        "type-is": "~1.6.18",
 | 
					 | 
				
			||||||
        "utils-merge": "1.0.1",
 | 
					 | 
				
			||||||
        "vary": "~1.1.2"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.10.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/express/node_modules/body-parser": {
 | 
					 | 
				
			||||||
      "version": "1.19.2",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "bytes": "3.1.2",
 | 
					 | 
				
			||||||
        "content-type": "~1.0.4",
 | 
					 | 
				
			||||||
        "debug": "2.6.9",
 | 
					 | 
				
			||||||
        "depd": "~1.1.2",
 | 
					 | 
				
			||||||
        "http-errors": "1.8.1",
 | 
					 | 
				
			||||||
        "iconv-lite": "0.4.24",
 | 
					 | 
				
			||||||
        "on-finished": "~2.3.0",
 | 
					 | 
				
			||||||
        "qs": "6.9.7",
 | 
					 | 
				
			||||||
        "raw-body": "2.4.3",
 | 
					 | 
				
			||||||
        "type-is": "~1.6.18"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.8"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/express/node_modules/depd": {
 | 
					 | 
				
			||||||
      "version": "1.1.2",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.6"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/express/node_modules/http-errors": {
 | 
					 | 
				
			||||||
      "version": "1.8.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "depd": "~1.1.2",
 | 
					 | 
				
			||||||
        "inherits": "2.0.4",
 | 
					 | 
				
			||||||
        "setprototypeof": "1.2.0",
 | 
					 | 
				
			||||||
        "statuses": ">= 1.5.0 < 2",
 | 
					 | 
				
			||||||
        "toidentifier": "1.0.1"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.6"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/express/node_modules/on-finished": {
 | 
					 | 
				
			||||||
      "version": "2.3.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "ee-first": "1.1.1"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.8"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/express/node_modules/qs": {
 | 
					 | 
				
			||||||
      "version": "6.9.7",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=0.6"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "funding": {
 | 
					 | 
				
			||||||
        "url": "https://github.com/sponsors/ljharb"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/express/node_modules/raw-body": {
 | 
					 | 
				
			||||||
      "version": "2.4.3",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "bytes": "3.1.2",
 | 
					 | 
				
			||||||
        "http-errors": "1.8.1",
 | 
					 | 
				
			||||||
        "iconv-lite": "0.4.24",
 | 
					 | 
				
			||||||
        "unpipe": "1.0.0"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.8"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/finalhandler": {
 | 
					 | 
				
			||||||
      "version": "1.1.2",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "debug": "2.6.9",
 | 
					 | 
				
			||||||
        "encodeurl": "~1.0.2",
 | 
					 | 
				
			||||||
        "escape-html": "~1.0.3",
 | 
					 | 
				
			||||||
        "on-finished": "~2.3.0",
 | 
					 | 
				
			||||||
        "parseurl": "~1.3.3",
 | 
					 | 
				
			||||||
        "statuses": "~1.5.0",
 | 
					 | 
				
			||||||
        "unpipe": "~1.0.0"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.8"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/finalhandler/node_modules/on-finished": {
 | 
					 | 
				
			||||||
      "version": "2.3.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "ee-first": "1.1.1"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.8"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/forwarded": {
 | 
					 | 
				
			||||||
      "version": "0.2.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.6"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/fresh": {
 | 
					 | 
				
			||||||
      "version": "0.5.2",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.6"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/fs": {
 | 
					 | 
				
			||||||
      "version": "0.0.1-security",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/function-bind": {
 | 
					 | 
				
			||||||
      "version": "1.1.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/get-intrinsic": {
 | 
					 | 
				
			||||||
      "version": "1.1.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "function-bind": "^1.1.1",
 | 
					 | 
				
			||||||
        "has": "^1.0.3",
 | 
					 | 
				
			||||||
        "has-symbols": "^1.0.1"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "funding": {
 | 
					 | 
				
			||||||
        "url": "https://github.com/sponsors/ljharb"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/has": {
 | 
					 | 
				
			||||||
      "version": "1.0.3",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "function-bind": "^1.1.1"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.4.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/has-symbols": {
 | 
					 | 
				
			||||||
      "version": "1.0.3",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.4"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "funding": {
 | 
					 | 
				
			||||||
        "url": "https://github.com/sponsors/ljharb"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/http-errors": {
 | 
					 | 
				
			||||||
      "version": "2.0.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "depd": "2.0.0",
 | 
					 | 
				
			||||||
        "inherits": "2.0.4",
 | 
					 | 
				
			||||||
        "setprototypeof": "1.2.0",
 | 
					 | 
				
			||||||
        "statuses": "2.0.1",
 | 
					 | 
				
			||||||
        "toidentifier": "1.0.1"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.8"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/http-errors/node_modules/statuses": {
 | 
					 | 
				
			||||||
      "version": "2.0.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.8"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/https": {
 | 
					 | 
				
			||||||
      "version": "1.0.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-PDfHrhqO65ZpBKKtHpdaGUt+06Q="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/iconv-lite": {
 | 
					 | 
				
			||||||
      "version": "0.4.24",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "safer-buffer": ">= 2.1.2 < 3"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=0.10.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/inherits": {
 | 
					 | 
				
			||||||
      "version": "2.0.4",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/ipaddr.js": {
 | 
					 | 
				
			||||||
      "version": "1.9.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.10"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/media-typer": {
 | 
					 | 
				
			||||||
      "version": "0.3.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.6"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/merge-descriptors": {
 | 
					 | 
				
			||||||
      "version": "1.0.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/methods": {
 | 
					 | 
				
			||||||
      "version": "1.1.2",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.6"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/mime": {
 | 
					 | 
				
			||||||
      "version": "1.6.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
 | 
					 | 
				
			||||||
      "bin": {
 | 
					 | 
				
			||||||
        "mime": "cli.js"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=4"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/mime-db": {
 | 
					 | 
				
			||||||
      "version": "1.52.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.6"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/mime-types": {
 | 
					 | 
				
			||||||
      "version": "2.1.35",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "mime-db": "1.52.0"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.6"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/ms": {
 | 
					 | 
				
			||||||
      "version": "2.0.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/negotiator": {
 | 
					 | 
				
			||||||
      "version": "0.6.3",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.6"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/object-inspect": {
 | 
					 | 
				
			||||||
      "version": "1.12.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
 | 
					 | 
				
			||||||
      "funding": {
 | 
					 | 
				
			||||||
        "url": "https://github.com/sponsors/ljharb"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/on-finished": {
 | 
					 | 
				
			||||||
      "version": "2.4.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "ee-first": "1.1.1"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.8"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/packet-reader": {
 | 
					 | 
				
			||||||
      "version": "1.0.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/parseurl": {
 | 
					 | 
				
			||||||
      "version": "1.3.3",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.8"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/path-to-regexp": {
 | 
					 | 
				
			||||||
      "version": "0.1.7",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/pg": {
 | 
					 | 
				
			||||||
      "version": "8.7.3",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/pg/-/pg-8.7.3.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-HPmH4GH4H3AOprDJOazoIcpI49XFsHCe8xlrjHkWiapdbHK+HLtbm/GQzXYAZwmPju/kzKhjaSfMACG+8cgJcw==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "buffer-writer": "2.0.0",
 | 
					 | 
				
			||||||
        "packet-reader": "1.0.0",
 | 
					 | 
				
			||||||
        "pg-connection-string": "^2.5.0",
 | 
					 | 
				
			||||||
        "pg-pool": "^3.5.1",
 | 
					 | 
				
			||||||
        "pg-protocol": "^1.5.0",
 | 
					 | 
				
			||||||
        "pg-types": "^2.1.0",
 | 
					 | 
				
			||||||
        "pgpass": "1.x"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 8.0.0"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "peerDependencies": {
 | 
					 | 
				
			||||||
        "pg-native": ">=2.0.0"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "peerDependenciesMeta": {
 | 
					 | 
				
			||||||
        "pg-native": {
 | 
					 | 
				
			||||||
          "optional": true
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/pg-connection-string": {
 | 
					 | 
				
			||||||
      "version": "2.5.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ=="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/pg-int8": {
 | 
					 | 
				
			||||||
      "version": "1.0.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=4.0.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/pg-pool": {
 | 
					 | 
				
			||||||
      "version": "3.5.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ==",
 | 
					 | 
				
			||||||
      "peerDependencies": {
 | 
					 | 
				
			||||||
        "pg": ">=8.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/pg-protocol": {
 | 
					 | 
				
			||||||
      "version": "1.5.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ=="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/pg-types": {
 | 
					 | 
				
			||||||
      "version": "2.2.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "pg-int8": "1.0.1",
 | 
					 | 
				
			||||||
        "postgres-array": "~2.0.0",
 | 
					 | 
				
			||||||
        "postgres-bytea": "~1.0.0",
 | 
					 | 
				
			||||||
        "postgres-date": "~1.0.4",
 | 
					 | 
				
			||||||
        "postgres-interval": "^1.1.0"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=4"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/pgpass": {
 | 
					 | 
				
			||||||
      "version": "1.0.5",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "split2": "^4.1.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/postgres-array": {
 | 
					 | 
				
			||||||
      "version": "2.0.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=4"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/postgres-bytea": {
 | 
					 | 
				
			||||||
      "version": "1.0.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=0.10.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/postgres-date": {
 | 
					 | 
				
			||||||
      "version": "1.0.7",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=0.10.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/postgres-interval": {
 | 
					 | 
				
			||||||
      "version": "1.2.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "xtend": "^4.0.0"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=0.10.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/proxy-addr": {
 | 
					 | 
				
			||||||
      "version": "2.0.7",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "forwarded": "0.2.0",
 | 
					 | 
				
			||||||
        "ipaddr.js": "1.9.1"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.10"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/qs": {
 | 
					 | 
				
			||||||
      "version": "6.10.3",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "side-channel": "^1.0.4"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=0.6"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "funding": {
 | 
					 | 
				
			||||||
        "url": "https://github.com/sponsors/ljharb"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/range-parser": {
 | 
					 | 
				
			||||||
      "version": "1.2.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.6"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/raw-body": {
 | 
					 | 
				
			||||||
      "version": "2.5.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "bytes": "3.1.2",
 | 
					 | 
				
			||||||
        "http-errors": "2.0.0",
 | 
					 | 
				
			||||||
        "iconv-lite": "0.4.24",
 | 
					 | 
				
			||||||
        "unpipe": "1.0.0"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.8"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/readline": {
 | 
					 | 
				
			||||||
      "version": "1.3.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/safe-buffer": {
 | 
					 | 
				
			||||||
      "version": "5.2.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
 | 
					 | 
				
			||||||
      "funding": [
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          "type": "github",
 | 
					 | 
				
			||||||
          "url": "https://github.com/sponsors/feross"
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          "type": "patreon",
 | 
					 | 
				
			||||||
          "url": "https://www.patreon.com/feross"
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          "type": "consulting",
 | 
					 | 
				
			||||||
          "url": "https://feross.org/support"
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      ]
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/safer-buffer": {
 | 
					 | 
				
			||||||
      "version": "2.1.2",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/send": {
 | 
					 | 
				
			||||||
      "version": "0.17.2",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "debug": "2.6.9",
 | 
					 | 
				
			||||||
        "depd": "~1.1.2",
 | 
					 | 
				
			||||||
        "destroy": "~1.0.4",
 | 
					 | 
				
			||||||
        "encodeurl": "~1.0.2",
 | 
					 | 
				
			||||||
        "escape-html": "~1.0.3",
 | 
					 | 
				
			||||||
        "etag": "~1.8.1",
 | 
					 | 
				
			||||||
        "fresh": "0.5.2",
 | 
					 | 
				
			||||||
        "http-errors": "1.8.1",
 | 
					 | 
				
			||||||
        "mime": "1.6.0",
 | 
					 | 
				
			||||||
        "ms": "2.1.3",
 | 
					 | 
				
			||||||
        "on-finished": "~2.3.0",
 | 
					 | 
				
			||||||
        "range-parser": "~1.2.1",
 | 
					 | 
				
			||||||
        "statuses": "~1.5.0"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.8.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/send/node_modules/depd": {
 | 
					 | 
				
			||||||
      "version": "1.1.2",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.6"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/send/node_modules/destroy": {
 | 
					 | 
				
			||||||
      "version": "1.0.4",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/send/node_modules/http-errors": {
 | 
					 | 
				
			||||||
      "version": "1.8.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "depd": "~1.1.2",
 | 
					 | 
				
			||||||
        "inherits": "2.0.4",
 | 
					 | 
				
			||||||
        "setprototypeof": "1.2.0",
 | 
					 | 
				
			||||||
        "statuses": ">= 1.5.0 < 2",
 | 
					 | 
				
			||||||
        "toidentifier": "1.0.1"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.6"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/send/node_modules/ms": {
 | 
					 | 
				
			||||||
      "version": "2.1.3",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/send/node_modules/on-finished": {
 | 
					 | 
				
			||||||
      "version": "2.3.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "ee-first": "1.1.1"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.8"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/serve-static": {
 | 
					 | 
				
			||||||
      "version": "1.14.2",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "encodeurl": "~1.0.2",
 | 
					 | 
				
			||||||
        "escape-html": "~1.0.3",
 | 
					 | 
				
			||||||
        "parseurl": "~1.3.3",
 | 
					 | 
				
			||||||
        "send": "0.17.2"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.8.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/setprototypeof": {
 | 
					 | 
				
			||||||
      "version": "1.2.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/side-channel": {
 | 
					 | 
				
			||||||
      "version": "1.0.4",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "call-bind": "^1.0.0",
 | 
					 | 
				
			||||||
        "get-intrinsic": "^1.0.2",
 | 
					 | 
				
			||||||
        "object-inspect": "^1.9.0"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "funding": {
 | 
					 | 
				
			||||||
        "url": "https://github.com/sponsors/ljharb"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/split2": {
 | 
					 | 
				
			||||||
      "version": "4.1.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 10.x"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/statuses": {
 | 
					 | 
				
			||||||
      "version": "1.5.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.6"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/toidentifier": {
 | 
					 | 
				
			||||||
      "version": "1.0.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=0.6"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/type-is": {
 | 
					 | 
				
			||||||
      "version": "1.6.18",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "media-typer": "0.3.0",
 | 
					 | 
				
			||||||
        "mime-types": "~2.1.24"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.6"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/unpipe": {
 | 
					 | 
				
			||||||
      "version": "1.0.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.8"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/utils-merge": {
 | 
					 | 
				
			||||||
      "version": "1.0.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.4.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/vary": {
 | 
					 | 
				
			||||||
      "version": "1.1.2",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">= 0.8"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/xtend": {
 | 
					 | 
				
			||||||
      "version": "4.0.2",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=0.4"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "accepts": {
 | 
					    "accepts": {
 | 
				
			||||||
      "version": "1.3.8",
 | 
					      "version": "1.3.8",
 | 
				
			||||||
@ -1315,8 +426,7 @@
 | 
				
			|||||||
    "pg-pool": {
 | 
					    "pg-pool": {
 | 
				
			||||||
      "version": "3.5.1",
 | 
					      "version": "3.5.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ==",
 | 
					      "integrity": "sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ=="
 | 
				
			||||||
      "requires": {}
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "pg-protocol": {
 | 
					    "pg-protocol": {
 | 
				
			||||||
      "version": "1.5.0",
 | 
					      "version": "1.5.0",
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										119
									
								
								routes/baseline/baseline.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								routes/baseline/baseline.sql
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,119 @@
 | 
				
			|||||||
 | 
					DELETE FROM fc.dcard WHERE app_version = 'app_forecast_name';
 | 
				
			||||||
 | 
					WITH
 | 
				
			||||||
 | 
					req AS  (SELECT $$app_req$$::jsonb j)
 | 
				
			||||||
 | 
					,ilog AS (
 | 
				
			||||||
 | 
					    INSERT INTO
 | 
				
			||||||
 | 
					        fc.log (doc)
 | 
				
			||||||
 | 
					    SELECT
 | 
				
			||||||
 | 
					        req.j 
 | 
				
			||||||
 | 
					    FROM
 | 
				
			||||||
 | 
					        req
 | 
				
			||||||
 | 
					    RETURNING *
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					,baseline AS (
 | 
				
			||||||
 | 
					SELECT
 | 
				
			||||||
 | 
					    null::integer AS id
 | 
				
			||||||
 | 
					    ,null::integer AS logid
 | 
				
			||||||
 | 
					    ,o."Trans. Date"
 | 
				
			||||||
 | 
					    ,o."Post Date"
 | 
				
			||||||
 | 
					    ,o."Description"
 | 
				
			||||||
 | 
					    ,sum(o."Amount") AS "Amount"
 | 
				
			||||||
 | 
					    ,o."Category"
 | 
				
			||||||
 | 
					    ,o."Party"
 | 
				
			||||||
 | 
					    ,o."Reason"
 | 
				
			||||||
 | 
					    ,sum(o.app_units) AS app_units
 | 
				
			||||||
 | 
					    ,'app_forecast_name' AS app_version
 | 
				
			||||||
 | 
					    ,'baseline' AS app_iter
 | 
				
			||||||
 | 
					    ,(SELECT id FROM ilog) AS app_logid
 | 
				
			||||||
 | 
					FROM
 | 
				
			||||||
 | 
					    fc.dcard o
 | 
				
			||||||
 | 
					WHERE
 | 
				
			||||||
 | 
					    (
 | 
				
			||||||
 | 
					        --base period orders booked....
 | 
				
			||||||
 | 
					        "Trans. Date" BETWEEN 'app_baseline_from_date'::date AND 'app_baseline_to_date'::date
 | 
				
			||||||
 | 
					        --...or any open orders currently booked before cutoff....
 | 
				
			||||||
 | 
					        OR ("Description" IN (app_openstatus_code) and "Trans. Date" <= 'app_openorder_cutoff'::date)
 | 
				
			||||||
 | 
					        --...or anything that shipped in that period
 | 
				
			||||||
 | 
					        OR ("Post Date" BETWEEN 'app_baseline_from_date'::date AND 'app_baseline_to_date'::date)
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    --be sure to pre-exclude unwanted items, like canceled orders, non-gross sales, and short-ships
 | 
				
			||||||
 | 
					GROUP BY
 | 
				
			||||||
 | 
					    o."Trans. Date"
 | 
				
			||||||
 | 
					    ,o."Post Date"
 | 
				
			||||||
 | 
					    ,o."Description"
 | 
				
			||||||
 | 
					    ,o."Category"
 | 
				
			||||||
 | 
					    ,o."Party"
 | 
				
			||||||
 | 
					    ,o."Reason"
 | 
				
			||||||
 | 
					UNION ALL
 | 
				
			||||||
 | 
					SELECT
 | 
				
			||||||
 | 
					    null::integer AS id
 | 
				
			||||||
 | 
					    ,null::integer AS logid
 | 
				
			||||||
 | 
					    ,o."Trans. Date" + interval '1 year' AS "Trans. Date"
 | 
				
			||||||
 | 
					    ,o."Post Date" + interval '1 year' AS "Post Date"
 | 
				
			||||||
 | 
					    ,o."Description"
 | 
				
			||||||
 | 
					    ,sum(o."Amount") AS "Amount"
 | 
				
			||||||
 | 
					    ,o."Category"
 | 
				
			||||||
 | 
					    ,o."Party"
 | 
				
			||||||
 | 
					    ,o."Reason"
 | 
				
			||||||
 | 
					    ,sum(o.app_units) AS app_units
 | 
				
			||||||
 | 
					    ,'app_forecast_name' AS app_version
 | 
				
			||||||
 | 
					    ,'baseline' AS app_iter
 | 
				
			||||||
 | 
					    ,(SELECT id FROM ilog) AS app_logid
 | 
				
			||||||
 | 
					FROM
 | 
				
			||||||
 | 
					    fc.dcard o
 | 
				
			||||||
 | 
					    LEFT OUTER JOIN fc.perd tdate ON
 | 
				
			||||||
 | 
					        (o."Trans. Date" + interval '1 year' )::date <@ tdate.drange
 | 
				
			||||||
 | 
					    LEFT OUTER JOIN fc.perd pdate ON
 | 
				
			||||||
 | 
					        (o."Post Date" + interval '1 year' )::date <@ pdate.drange
 | 
				
			||||||
 | 
					WHERE
 | 
				
			||||||
 | 
					    "Trans. Date" BETWEEN 'app_plug_fromdate'::date AND 'app_plug_todate'::date
 | 
				
			||||||
 | 
					    --be sure to pre-exclude unwanted items, like canceled orders, non-gross sales, and short-ships
 | 
				
			||||||
 | 
					GROUP BY
 | 
				
			||||||
 | 
					    o."Trans. Date"
 | 
				
			||||||
 | 
					    ,o."Post Date"
 | 
				
			||||||
 | 
					    ,o."Description"
 | 
				
			||||||
 | 
					    ,o."Category"
 | 
				
			||||||
 | 
					    ,o."Party"
 | 
				
			||||||
 | 
					    ,o."Reason")
 | 
				
			||||||
 | 
					,incr AS (
 | 
				
			||||||
 | 
					SELECT
 | 
				
			||||||
 | 
					    null::integer AS id
 | 
				
			||||||
 | 
					    ,null::integer AS logid
 | 
				
			||||||
 | 
					    ,o."Trans. Date" + interval '1 year' AS "Trans. Date"
 | 
				
			||||||
 | 
					    ,o."Post Date" + interval '1 year' AS "Post Date"
 | 
				
			||||||
 | 
					    ,o."Description"
 | 
				
			||||||
 | 
					    ,sum(o."Amount") AS "Amount"
 | 
				
			||||||
 | 
					    ,o."Category"
 | 
				
			||||||
 | 
					    ,o."Party"
 | 
				
			||||||
 | 
					    ,o."Reason"
 | 
				
			||||||
 | 
					    ,sum(o.app_units) AS app_units
 | 
				
			||||||
 | 
					    ,'app_forecast_name' AS app_version
 | 
				
			||||||
 | 
					    ,'baseline' AS app_iter
 | 
				
			||||||
 | 
					    ,(SELECT id FROM ilog) AS app_logid
 | 
				
			||||||
 | 
					FROM
 | 
				
			||||||
 | 
					    baseline o
 | 
				
			||||||
 | 
					LEFT OUTER JOIN fc.perd tdate ON
 | 
				
			||||||
 | 
					        (o."Trans. Date" + interval '1 year' )::date <@ tdate.drange
 | 
				
			||||||
 | 
					    LEFT OUTER JOIN fc.perd pdate ON
 | 
				
			||||||
 | 
					        (o."Post Date" + interval '1 year' )::date <@ pdate.drange
 | 
				
			||||||
 | 
					GROUP BY
 | 
				
			||||||
 | 
					    o."Trans. Date"
 | 
				
			||||||
 | 
					    ,o."Post Date"
 | 
				
			||||||
 | 
					    ,o."Description"
 | 
				
			||||||
 | 
					    ,o."Category"
 | 
				
			||||||
 | 
					    ,o."Party"
 | 
				
			||||||
 | 
					    ,o."Reason"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					,ins AS (
 | 
				
			||||||
 | 
					INSERT INTO
 | 
				
			||||||
 | 
					    fc.dcard
 | 
				
			||||||
 | 
					SELECT
 | 
				
			||||||
 | 
					    *
 | 
				
			||||||
 | 
					FROM
 | 
				
			||||||
 | 
					    incr i
 | 
				
			||||||
 | 
					WHERE
 | 
				
			||||||
 | 
					    i."Trans. Date" >= 'app_first_forecast_date'::date
 | 
				
			||||||
 | 
					    OR i."Post Date" >= 'app_first_forecast_date'::date
 | 
				
			||||||
 | 
					RETURNING *
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					SELECT COUNT(*) num_rows  FROM ins
 | 
				
			||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
# execure the sql for baseline which builds the sql and inserts into a table
 | 
					# execure the sql for baseline which builds the sql and inserts into a table
 | 
				
			||||||
#$PG -f routes/baseline/gen_baseline.sql
 | 
					#$PG -f routes/baseline/gen_baseline.sql
 | 
				
			||||||
# pull the sql out of the table and write it to route directory
 | 
					# pull the sql out of the table and write it to route directory
 | 
				
			||||||
$PG -c "SELECT t FROM fc.sql WHERE cmd = 'baseline'" -t -A -o routes/baseline/baseline.sql
 | 
					psql -h hptrow.me -p 54329 -d ubm -U ptrowbridge -c "SELECT t FROM fc.sql WHERE cmd = 'baseline'" -t -A -o routes/baseline/baseline.sql
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
# execure the sql for scale which builds the sql and inserts into a table
 | 
					# execure the sql for scale which builds the sql and inserts into a table
 | 
				
			||||||
#$PG -f ./routes/scale/gen_scale.sql
 | 
					#$PG -f ./routes/scale/gen_scale.sql
 | 
				
			||||||
# pull the sql out of the table and write it to route directory
 | 
					# pull the sql out of the table and write it to route directory
 | 
				
			||||||
$PG -c "SELECT t FROM fc.sql WHERE cmd = 'scale'" -t -A -o ./routes/scale/scale.sql
 | 
					psql -h hptrow.me -p 54329 -d ubm -U ptrowbridge -c "SELECT t FROM fc.sql WHERE cmd = 'scale'" -t -A -o ./routes/scale/scale.sql
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										154
									
								
								routes/scale/scale.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								routes/scale/scale.sql
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,154 @@
 | 
				
			|||||||
 | 
					WITH
 | 
				
			||||||
 | 
					req AS  (SELECT $$app_req$$::jsonb j)
 | 
				
			||||||
 | 
					,target AS (
 | 
				
			||||||
 | 
					    SELECT
 | 
				
			||||||
 | 
					        (req.j->>'app_vincr')::numeric vincr   --volume
 | 
				
			||||||
 | 
					        ,(req.j->>'app_pincr')::numeric pincr  --price
 | 
				
			||||||
 | 
					    FROM
 | 
				
			||||||
 | 
					        req
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					-----this block is supposed to test for new products that might not be in baseline etc-------
 | 
				
			||||||
 | 
					,test AS (
 | 
				
			||||||
 | 
					    SELECT
 | 
				
			||||||
 | 
					        sum(app_units) FILTER (WHERE app_iter <> 'ACTUALS') total
 | 
				
			||||||
 | 
					        ,sum(app_units) FILTER (WHERE app_iter = 'baseline') base
 | 
				
			||||||
 | 
					    FROM
 | 
				
			||||||
 | 
					        fc.dcard o 
 | 
				
			||||||
 | 
					    WHERE
 | 
				
			||||||
 | 
					        app_where
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					,ilog AS (
 | 
				
			||||||
 | 
					    INSERT INTO
 | 
				
			||||||
 | 
					        fc.log (doc)
 | 
				
			||||||
 | 
					    SELECT
 | 
				
			||||||
 | 
					        req.j 
 | 
				
			||||||
 | 
					    FROM
 | 
				
			||||||
 | 
					        req
 | 
				
			||||||
 | 
					    RETURNING *
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					------need to group basemix and forego any detail iterations
 | 
				
			||||||
 | 
					,basemix AS (
 | 
				
			||||||
 | 
					SELECT
 | 
				
			||||||
 | 
					    o.id
 | 
				
			||||||
 | 
					    ,o.logid
 | 
				
			||||||
 | 
					    ,o."Trans. Date"
 | 
				
			||||||
 | 
					    ,o."Post Date"
 | 
				
			||||||
 | 
					    ,o."Description"
 | 
				
			||||||
 | 
					    ,sum(o."Amount") AS "Amount"
 | 
				
			||||||
 | 
					    ,o."Category"
 | 
				
			||||||
 | 
					    ,o."Party"
 | 
				
			||||||
 | 
					    ,o."Reason"
 | 
				
			||||||
 | 
					    ,sum(o.app_units) AS app_units
 | 
				
			||||||
 | 
					    ,'app_forecast_name' AS app_version
 | 
				
			||||||
 | 
					    ,'scale' AS app_iter
 | 
				
			||||||
 | 
					    ,0::bigint AS app_logid
 | 
				
			||||||
 | 
					FROM
 | 
				
			||||||
 | 
					    fc.dcard o 
 | 
				
			||||||
 | 
					WHERE
 | 
				
			||||||
 | 
					    app_where
 | 
				
			||||||
 | 
					GROUP BY
 | 
				
			||||||
 | 
					    o.id
 | 
				
			||||||
 | 
					    ,o.logid
 | 
				
			||||||
 | 
					    ,o."Trans. Date"
 | 
				
			||||||
 | 
					    ,o."Post Date"
 | 
				
			||||||
 | 
					    ,o."Description"
 | 
				
			||||||
 | 
					    ,o."Category"
 | 
				
			||||||
 | 
					    ,o."Party"
 | 
				
			||||||
 | 
					    ,o."Reason"
 | 
				
			||||||
 | 
					),
 | 
				
			||||||
 | 
					vscale AS (
 | 
				
			||||||
 | 
					    SELECT
 | 
				
			||||||
 | 
					        (SELECT vincr FROM target) AS target_increment
 | 
				
			||||||
 | 
					        ,sum(app_units) AS units
 | 
				
			||||||
 | 
					        ,CASE WHEN sum(app_units) = 0 THEN 0 ELSE (SELECT vincr FROM target)/sum(app_units) END AS factor
 | 
				
			||||||
 | 
					    FROM
 | 
				
			||||||
 | 
					        basemix
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					,volume_only AS (
 | 
				
			||||||
 | 
					SELECT
 | 
				
			||||||
 | 
					    o.id
 | 
				
			||||||
 | 
					    ,o.logid
 | 
				
			||||||
 | 
					    ,o."Trans. Date"
 | 
				
			||||||
 | 
					    ,o."Post Date"
 | 
				
			||||||
 | 
					    ,o."Description"
 | 
				
			||||||
 | 
					    ,round(o."Amount" * vscale.factor,2) AS "Amount"
 | 
				
			||||||
 | 
					    ,o."Category"
 | 
				
			||||||
 | 
					    ,o."Party"
 | 
				
			||||||
 | 
					    ,o."Reason"
 | 
				
			||||||
 | 
					    ,round(o.app_units * vscale.factor,5) AS app_units
 | 
				
			||||||
 | 
					    ,'app_forecast_name' AS app_version
 | 
				
			||||||
 | 
					    ,'scale volume' AS app_iter
 | 
				
			||||||
 | 
					    ,(SELECT id FROM ilog) AS app_logid
 | 
				
			||||||
 | 
					FROM
 | 
				
			||||||
 | 
					    basemix o
 | 
				
			||||||
 | 
					    CROSS JOIN vscale
 | 
				
			||||||
 | 
					WHERE
 | 
				
			||||||
 | 
					    vscale.factor <> 0
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					,volume AS (
 | 
				
			||||||
 | 
					    SELECT * FROM volume_only
 | 
				
			||||||
 | 
					    UNION ALL
 | 
				
			||||||
 | 
					    SELECT * FROM basemix WHERE (SELECT factor FROM vscale) = 0
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					,pscale AS (
 | 
				
			||||||
 | 
					SELECT
 | 
				
			||||||
 | 
					    (SELECT pincr FROM target) AS target_increment
 | 
				
			||||||
 | 
					    ,sum("Amount") AS value
 | 
				
			||||||
 | 
					    ,CASE WHEN (SELECT sum("Amount") FROM volume) = 0 THEN
 | 
				
			||||||
 | 
					        --if the base value is -0- scaling will not work, need to generate price, factor goes to -0-
 | 
				
			||||||
 | 
					        0
 | 
				
			||||||
 | 
					    ELSE
 | 
				
			||||||
 | 
					        CASE WHEN (SELECT factor FROM vscale) = 0
 | 
				
			||||||
 | 
					            --if the incoming volume dataset has just basemix data, then create an absolute factor and multiply by basemix
 | 
				
			||||||
 | 
					            THEN (SELECT pincr FROM target)/(SELECT sum("Amount") FROM volume)
 | 
				
			||||||
 | 
					            --if the incoming volume table already has an adjusment, just need to create a true-up factor
 | 
				
			||||||
 | 
					            --multiplying by the raw factor without adding 1 will work since this data set will be added to the volume data set
 | 
				
			||||||
 | 
					            ELSE ((SELECT pincr FROM target)-(SELECT sum("Amount") FROM volume))/(SELECT sum("Amount") FROM volume)
 | 
				
			||||||
 | 
					        END
 | 
				
			||||||
 | 
					    END factor
 | 
				
			||||||
 | 
					    ,CASE WHEN (SELECT sum("Amount") FROM volume) = 0 THEN
 | 
				
			||||||
 | 
					        CASE WHEN ((SELECT pincr::numeric FROM target) - (SELECT sum("Amount") FROM volume)) <> 0 THEN
 | 
				
			||||||
 | 
					            --if the base value is -0- but the target value hasn't been achieved, derive a price to apply
 | 
				
			||||||
 | 
					            ((SELECT pincr::numeric FROM target) - (SELECT sum("Amount") FROM volume))/(SELECT sum(app_units) FROM volume)
 | 
				
			||||||
 | 
					        ELSE
 | 
				
			||||||
 | 
					            0
 | 
				
			||||||
 | 
					        END
 | 
				
			||||||
 | 
					    ELSE
 | 
				
			||||||
 | 
					        0
 | 
				
			||||||
 | 
					    END mod_price
 | 
				
			||||||
 | 
					FROM
 | 
				
			||||||
 | 
					    volume
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					,pricing AS (
 | 
				
			||||||
 | 
					SELECT
 | 
				
			||||||
 | 
					    o.id
 | 
				
			||||||
 | 
					    ,o.logid
 | 
				
			||||||
 | 
					    ,o."Trans. Date"
 | 
				
			||||||
 | 
					    ,o."Post Date"
 | 
				
			||||||
 | 
					    ,o."Description"
 | 
				
			||||||
 | 
					    ,round((CASE WHEN pscale.factor = 0 THEN o.app_units * pscale.mod_price ELSE o."Amount" * pscale.factor END)::numeric,2) AS "Amount"
 | 
				
			||||||
 | 
					    ,o."Category"
 | 
				
			||||||
 | 
					    ,o."Party"
 | 
				
			||||||
 | 
					    ,o."Reason"
 | 
				
			||||||
 | 
					    ,0::numeric AS app_units
 | 
				
			||||||
 | 
					    ,'app_forecast_name' AS app_version
 | 
				
			||||||
 | 
					    ,'scale price' AS app_iter
 | 
				
			||||||
 | 
					    ,(SELECT id FROM ilog) AS app_logid
 | 
				
			||||||
 | 
					FROM
 | 
				
			||||||
 | 
					    volume o
 | 
				
			||||||
 | 
					    CROSS JOIN pscale
 | 
				
			||||||
 | 
					WHERE
 | 
				
			||||||
 | 
					    pscale.factor <> 0 or pscale.mod_price <> 0
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					INSERT INTO
 | 
				
			||||||
 | 
					    fc.dcard
 | 
				
			||||||
 | 
					SELECT 
 | 
				
			||||||
 | 
					    * 
 | 
				
			||||||
 | 
					FROM 
 | 
				
			||||||
 | 
					    volume_only
 | 
				
			||||||
 | 
					UNION ALL 
 | 
				
			||||||
 | 
					SELECT 
 | 
				
			||||||
 | 
					    * 
 | 
				
			||||||
 | 
					FROM 
 | 
				
			||||||
 | 
					    pricing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user