diff --git a/bascula_autonoma_1.json b/bascula_autonoma_1.json index 01fc6cb..817b452 100644 --- a/bascula_autonoma_1.json +++ b/bascula_autonoma_1.json @@ -602,7 +602,6 @@ "83a963e6bc339f0e", "4a10854d5d2302af", "76471be6630c1c3c", - "689afd7656952062", "0ebfa0099db1ed19", "658bbf0ae0c6d8de", "16994333f8deedd9", @@ -1604,7 +1603,7 @@ "z": "953e8740401d175c", "g": "3d6884b5563ad96b", "name": "matricula edit", - "func": "if (msg.topic == \"corregida\"){\n const corregida = msg.payload\n // Verificar si el último carácter es un espacio y eliminarlo si lo es\n if (corregida.length > 0 && corregida[corregida.length - 1] === ' ') {\n corregida.pop(); // Elimina el último elemento\n }\n const matricula = corregida.join('')\n flow.set(\"matricula_corregida\", matricula)\n const regex = /(\\d+)|([A-Z]+)/g; // separamos los grupos para que sea mas facil leerlos en el popup\n const matricula_new = matricula.replace(regex, '$1 $2 ');\n //node.send([{payload:{tab:\"Totem\"}}, {payload: {numero_vial:flow.get(\"numero_vial\"), totem_id:flow.get(\"totem_id\"), matricula_corregida: matricula}}]);\n \n node.send([null, null, {payload:\"

MATRICULA MODIFICADA :

\" + matricula_new +\"

\"}, null]);\n \n}\n// En el siguiente \"if\" incluimos QR y RFID porque si cuando se saca la notificacion de editar matricula el usuario \n// presenta identificacion valida entonces no debemos mostrar la pantalla de edicion al salir de la notificacion\nelse if(flow.get(\"badplate\") && msg.payload ==\"OK\" && !flow.get(\"QR_revisado\") && !flow.get(\"RFID_revisado\")){\n flow.set(\"badplate\", false)\n flow.set(\"editor_matricula_ok\", true) // indica que hemos aceptado ir al editor de matricula\n node.send([{payload:{tab:\"Matricula\"}}, null, null, null]); \n}\nelse if (msg.payload == \"SI\"){\n if (!flow.get(\"supervisor\")) {\n flow.set(\"matricula\", flow.get(\"matricula_corregida\")) //actualiza la matricula en memoria y en pantalla\n flow.set(\"badplate\", false)\n flow.set(\"matricula_formato_flag\", true)\n flow.set(\"matricula_editada_flag\", true) // marcamos que la matricula fue editada por el conductor\n flow.set(\"nota_vuelva_intentar_done\", false) // para poder sacar la notificacion en caso que haya que volver a sacar editor nuevamente\n flow.set(\"matricula_revisada\", false) // para poder volver a revisar en base de datos\n let now = new Date()\n let nowdate = now.toLocaleString(\"sv-SE\").replace(/[- :]/g, \"\")\n flow.set(\"nombre_imagen\", flow.get(\"matricula\") + \"-\" + nowdate + \".jpg\")\n //node.send([{ payload: { tab: \"Totem\" } }, { payload: { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\"), matricula_corregida: flow.get(\"matricula_corregida\") } }, null]);\n node.send([{ payload: { tab: \"Totem\" } }, { payload: 1 }, null, null]);\n }\n else{\n node.send([{ payload: { tab: \"Totem\" } }, {payload: 1}, null, { payload: { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\"), matricula_corregida: flow.get(\"matricula_corregida\") } }]);\n }\n}\nreturn ;", + "func": "if (msg.topic == \"corregida\"){\n const corregida = msg.payload\n // Verificar si el último carácter es un espacio y eliminarlo si lo es\n if (corregida.length > 0 && corregida[corregida.length - 1] === ' ') {\n corregida.pop(); // Elimina el último elemento\n }\n const matricula = corregida.join('')\n flow.set(\"matricula_corregida\", matricula)\n const regex = /(\\d+)|([A-Z]+)/g; // separamos los grupos para que sea mas facil leerlos en el popup\n const matricula_new = matricula.replace(regex, '$1 $2 ');\n //node.send([{payload:{tab:\"Totem\"}}, {payload: {numero_vial:flow.get(\"numero_vial\"), totem_id:flow.get(\"totem_id\"), matricula_corregida: matricula}}]);\n \n node.send([null, null, {payload:\"

MATRICULA MODIFICADA :

\" + matricula_new +\"

\"}, null]);\n \n}\n// En el siguiente \"if\" incluimos RFID porque si cuando se saca la notificacion de editar matricula el usuario \n// presenta identificacion de tarjeta valida entonces no debemos mostrar la pantalla de edicion al salir de la notificacion\nelse if(flow.get(\"badplate\") && msg.payload ==\"OK\" && !flow.get(\"RFID_revisado\")){\n flow.set(\"badplate\", false)\n flow.set(\"editor_matricula_ok\", true) // indica que hemos aceptado ir al editor de matricula\n node.send([{payload:{tab:\"Matricula\"}}, null, null, null]); \n}\nelse if (msg.payload == \"SI\"){\n if (!flow.get(\"supervisor\")) {\n flow.set(\"matricula\", flow.get(\"matricula_corregida\")) //actualiza la matricula en memoria y en pantalla\n flow.set(\"badplate\", false)\n flow.set(\"matricula_formato_flag\", true)\n flow.set(\"matricula_editada_flag\", true) // marcamos que la matricula fue editada por el conductor\n flow.set(\"nota_vuelva_intentar_done\", false) // para poder sacar la notificacion en caso que haya que volver a sacar editor nuevamente\n flow.set(\"matricula_revisada\", false) // para poder volver a revisar en base de datos\n flow.set(\"matriculacheck_solicitada\", false) // marca que hay que solicitar revision de matricula\n let now = new Date()\n let nowdate = now.toLocaleString(\"sv-SE\").replace(/[- :]/g, \"\")\n flow.set(\"nombre_imagen\", flow.get(\"matricula\") + \"-\" + nowdate + \".jpg\")\n //node.send([{ payload: { tab: \"Totem\" } }, { payload: { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\"), matricula_corregida: flow.get(\"matricula_corregida\") } }, null]);\n node.send([{ payload: { tab: \"Totem\" } }, { payload: 1 }, null, null]);\n }\n else{\n node.send([{ payload: { tab: \"Totem\" } }, {payload: 1}, null, { payload: { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\"), matricula_corregida: flow.get(\"matricula_corregida\") } }]);\n }\n}\nreturn ;", "outputs": 4, "timeout": 0, "noerr": 0, @@ -2095,7 +2094,6 @@ "id": "0bc82cd2485c7679", "type": "inject", "z": "953e8740401d175c", - "d": true, "g": "6443f177eec330e4", "name": "distance ID1", "props": [ @@ -2738,7 +2736,7 @@ "z": "953e8740401d175c", "g": "0e2b148022a7af13", "name": " envia matricula", - "func": "if (!flow.get(\"plate_sent\")) {\n var timestamp = new Date().getTime()\n var plate = RED.util.cloneMessage(flow.get(\"last_plate\"))\n var plate_number = plate.payload.Picture.Plate.PlateNumber\n var plate_time = plate.payload.Picture.SnapInfo.SnapTime\n //node.send([{payload:plate.payload.Picture.NormalPic.Content, filename:\"/home/trypton/.node-red/dahua_images/\" + plate.payload.Picture.NormalPic.PicName}, null])\n flow.set(\"matricula\", plate_number)\n flow.set(\"matricula_image\", plate.payload.Picture.NormalPic.Content)\n flow.set(\"plate_sent\", true) // marcamos matricula enviada\n if (!flow.get(\"supervisor\")) {\n //node.warn(\"matricula leida\")\n flow.set(\"matricula_leida_flag\", true)\n //flow.set(\"nombre_imagen\", plate.payload.Picture.NormalPic.PicName)\n let now = new Date()\n let nowdate = now.toLocaleString(\"sv-SE\").replace(/[- :]/g, \"\")\n flow.set(\"nombre_imagen\", flow.get(\"matricula\") + \"-\" + nowdate + \".jpg\")\n if (plate_number == \"NOT FOUND\") {\n flow.set(\"matricula_formato_flag\", false)\n }\n else {\n let checkmatricula = checkPlateFormat(plate_number)\n flow.set(\"matricula_formato_flag\", checkmatricula.isValid)\n flow.set(\"matricula\", checkmatricula.formattedText)\n }\n\n msg = {}\n msg.payload = 1\n msg.topic = \"matricula_leida\"\n msg.matricula = flow.get(\"matricula\")\n\n node.send([null, msg, null]);\n }\n\n else { // caso supervisor = true\n if (!flow.get(\"peso_bajo_flag\")) {\n let msg_json = {}\n msg_json.payload = { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\"), \"matricula\": flow.get(\"matricula\"), \"foto_matricula\": flow.get(\"matricula_image\") }\n node.send([null, { payload: true }, msg_json]);\n }\n }\n}\nreturn\n\n/*******************************************************************************************\n * FUNCION DE CHEQUEO DEL FORMATO DE LA MATRICULA\n *******************************************************************************************\n*/\nfunction checkPlateFormat(plate) {\n\n let formatoPais = flow.get(\"formatoPais\")\n let match\n\n // Seleccion del formato\n if (formatoPais === \"es\") {\n //ESPAÑA\n const regex1 = /^(\\d{4}[A-Z]{3})(.*)$/i;\n const regex2 = /^([A-Z]{1,2}\\d{4}[A-Z]{2})(.*)$/i;\n match = plate.match(regex1) || plate.match(regex2);\n } if (formatoPais === \"co\") {\n //COLOMBIA\n const regexCargaGeneral = /^[A-Z]\\d{4}$/;\n const regexCargaT = /^T\\d{4}$/;\n const regexDiplomaticos = /^[A-Z]{2}\\d{4}$/;\n const regexParticulares = /^[A-Z]{3}\\d{3}$/;\n match = plate.match(regexCargaGeneral) || plate.match(regexCargaT) || plate.match(regexDiplomaticos) || plate.match(regexParticulares);\n }\n // Aplicacion del formato seleccionado\n flow.set(\"match\", match)\n if (match) {\n return {\n isValid: true,\n formattedText: match[0] // Solo tomamos el primer grupo de captura (la matrícula válida)\n };\n } else {\n return {\n isValid: false,\n formattedText: plate\n };\n }\n}\n\n\n\n\n\n\n\n\n\n\n/*******************************************************************************************\n * FUNCION DE CHEQUEO DEL FORMATO DE LA MATRICULA\n *******************************************************************************************\n * Esta funcion chequea:\n * 1.- si el formato de la matricula se corresponde con 4 numeros y 3 letras o bien con 1 o 2 letras, 4 nuemros y 2 letras\n * 2.- si tiene letras adicionales al final de la matricula (como SP), las elimina \n * 3.- devuelve validez del formato y contenidos de la matricula\n*/\n/*\nfunction checkPlateFormat(plate) {\n // Expresiones regulares para los dos formatos, capturando cualquier cosa extra al final\n // En el formato 1 el primer grupo de captura contiene los caracteres permitidos de la matricula (\\d{4}[A-Z]{3}) y el segundo grupo de captura (.*) los caracteres que no queremos\n // En el formato 2 el primer grupo de captura contiene los caracteres permitidos de la matricula ([A-Z]{1,2}\\d{4}[A-Z]{2}) y el segundo grupo de captura (.*) los caracteres que no queremos\n const regex1 = /^(\\d{4}[A-Z]{3})(.*)$/i;\n const regex2 = /^([A-Z]{1,2}\\d{4}[A-Z]{2})(.*)$/i;\n\n let match = plate.match(regex1) || plate.match(regex2);\n flow.set(\"match\", match)\n if (match) {\n return {\n isValid: true,\n formattedText: match[1] // Solo tomamos el primer grupo de captura (la matrícula válida)\n };\n } else {\n return {\n isValid: false,\n formattedText: plate\n };\n }\n}\n*/", + "func": "if (!flow.get(\"plate_sent\") && !flow.get(\"peso_bajo_flag\")) {\n var timestamp = new Date().getTime()\n var plate = RED.util.cloneMessage(flow.get(\"last_plate\"))\n var plate_number = plate.payload.Picture.Plate.PlateNumber\n var plate_time = plate.payload.Picture.SnapInfo.SnapTime\n //node.send([{payload:plate.payload.Picture.NormalPic.Content, filename:\"/home/trypton/.node-red/dahua_images/\" + plate.payload.Picture.NormalPic.PicName}, null])\n flow.set(\"matricula\", plate_number)\n flow.set(\"matricula_image\", plate.payload.Picture.NormalPic.Content)\n flow.set(\"plate_sent\", true) // marcamos matricula enviada\n if (!flow.get(\"supervisor\")) {\n //node.warn(\"matricula leida\")\n flow.set(\"matricula_leida_flag\", true)\n //flow.set(\"nombre_imagen\", plate.payload.Picture.NormalPic.PicName)\n let now = new Date()\n let nowdate = now.toLocaleString(\"sv-SE\").replace(/[- :]/g, \"\")\n flow.set(\"nombre_imagen\", flow.get(\"matricula\") + \"-\" + nowdate + \".jpg\")\n if (plate_number == \"NOT FOUND\") {\n flow.set(\"matricula_formato_flag\", false)\n }\n else {\n let checkmatricula = checkPlateFormat(plate_number)\n flow.set(\"matricula_formato_flag\", checkmatricula.isValid)\n flow.set(\"matricula\", checkmatricula.formattedText)\n }\n\n msg = {}\n msg.payload = 1\n msg.topic = \"matricula_leida\"\n msg.matricula = flow.get(\"matricula\")\n\n node.send([null, msg, null]);\n }\n\n else { // caso supervisor = true\n if (!flow.get(\"peso_bajo_flag\")) {\n let msg_json = {}\n msg_json.payload = { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\"), \"matricula\": flow.get(\"matricula\"), \"foto_matricula\": flow.get(\"matricula_image\") }\n node.send([null, { payload: true }, msg_json]);\n }\n }\n}\nreturn\n\n/*******************************************************************************************\n * FUNCION DE CHEQUEO DEL FORMATO DE LA MATRICULA\n *******************************************************************************************\n*/\nfunction checkPlateFormat(plate) {\n\n let formatoPais = flow.get(\"formatoPais\")\n let match\n\n // Seleccion del formato\n if (formatoPais === \"es\") {\n //ESPAÑA\n const regex1 = /^(\\d{4}[A-Z]{3})(.*)$/i;\n const regex2 = /^([A-Z]{1,2}\\d{4}[A-Z]{2})(.*)$/i;\n match = plate.match(regex1) || plate.match(regex2);\n } if (formatoPais === \"co\") {\n //COLOMBIA\n const regexCargaGeneral = /^[A-Z]\\d{4}$/;\n const regexCargaT = /^T\\d{4}$/;\n const regexDiplomaticos = /^[A-Z]{2}\\d{4}$/;\n const regexParticulares = /^[A-Z]{3}\\d{3}$/;\n match = plate.match(regexCargaGeneral) || plate.match(regexCargaT) || plate.match(regexDiplomaticos) || plate.match(regexParticulares);\n }\n // Aplicacion del formato seleccionado\n flow.set(\"match\", match)\n if (match) {\n return {\n isValid: true,\n formattedText: match[0] // Solo tomamos el primer grupo de captura (la matrícula válida)\n };\n } else {\n return {\n isValid: false,\n formattedText: plate\n };\n }\n}\n\n\n\n\n\n\n\n\n\n\n/*******************************************************************************************\n * FUNCION DE CHEQUEO DEL FORMATO DE LA MATRICULA\n *******************************************************************************************\n * Esta funcion chequea:\n * 1.- si el formato de la matricula se corresponde con 4 numeros y 3 letras o bien con 1 o 2 letras, 4 nuemros y 2 letras\n * 2.- si tiene letras adicionales al final de la matricula (como SP), las elimina \n * 3.- devuelve validez del formato y contenidos de la matricula\n*/\n/*\nfunction checkPlateFormat(plate) {\n // Expresiones regulares para los dos formatos, capturando cualquier cosa extra al final\n // En el formato 1 el primer grupo de captura contiene los caracteres permitidos de la matricula (\\d{4}[A-Z]{3}) y el segundo grupo de captura (.*) los caracteres que no queremos\n // En el formato 2 el primer grupo de captura contiene los caracteres permitidos de la matricula ([A-Z]{1,2}\\d{4}[A-Z]{2}) y el segundo grupo de captura (.*) los caracteres que no queremos\n const regex1 = /^(\\d{4}[A-Z]{3})(.*)$/i;\n const regex2 = /^([A-Z]{1,2}\\d{4}[A-Z]{2})(.*)$/i;\n\n let match = plate.match(regex1) || plate.match(regex2);\n flow.set(\"match\", match)\n if (match) {\n return {\n isValid: true,\n formattedText: match[1] // Solo tomamos el primer grupo de captura (la matrícula válida)\n };\n } else {\n return {\n isValid: false,\n formattedText: plate\n };\n }\n}\n*/", "outputs": 3, "timeout": 0, "noerr": 0, @@ -3533,7 +3531,7 @@ "z": "953e8740401d175c", "g": "646bdfb9988a1708", "name": "Check JSON content", - "func": "if ((msg.payload.totem_id == flow.get(\"totem_id\") || msg.payload.totem_id == \"*\") && msg.payload.numero_vial == flow.get(\"numero_vial\")) { // verifica que los datos son para este totem\n//if (msg.payload.numero_vial == flow.get(\"numero_vial\")) { // verifica que los datos son para este vial \n //guarda los elementos JSON recibidos del supervisor\n /*\n if (msg.payload.hasOwnProperty(\"numero_vial\")){\n flow.set(\"numero_vial\", msg.payload.numero_vial);\n }\n */\n if (msg.payload.hasOwnProperty(\"peso\")){\n flow.set(\"peso\", msg.payload.peso);\n \n }\n if (flow.get(\"supervisor\")) {\n if (msg.payload.hasOwnProperty(\"peso_estable\")) {\n flow.set(\"peso_estable\", msg.payload.peso_estable);\n }\n if (msg.payload.hasOwnProperty(\"peso_estable_flag\")) {\n flow.set(\"peso_estable_flag\", msg.payload.peso_estable_flag);\n }\n if (msg.payload.hasOwnProperty(\"fin_pesada_flag\")) {\n flow.set(\"fin_pesada_flag\", msg.payload.fin_pesada_flag);\n }\n if (msg.payload.hasOwnProperty(\"firma_cmd_flag\")) {\n flow.set(\"firma_cmd_flag\", msg.payload.firma_cmd_flag);\n flow.set(\"firma_flag\", true);\n }\n if (msg.payload.hasOwnProperty(\"remover_firma\")) {\n flow.set(\"remover_firma\", msg.payload.remover_firma);\n }\n if (msg.payload.hasOwnProperty(\"id_leido\")) {\n flow.set(\"id_leido\", msg.payload.id_leido);\n }\n if (msg.payload.hasOwnProperty(\"id_no_leido\")) {\n flow.set(\"id_no_leido\", msg.payload.id_no_leido);\n }\n if (msg.payload.hasOwnProperty(\"id_tarjeta\")) {\n flow.set(\"id_tarjeta\", msg.payload.id_tarjeta);\n }\n if (msg.payload.hasOwnProperty(\"matricula\")) {\n flow.set(\"matricula\", msg.payload.matricula);\n }\n \n }\n //****************************** RESPUESTA DE LA REVISION DE LA MATRICULA EN BD *******************************************\n if (msg.payload.hasOwnProperty(\"registrada\")) {\n //node.warn(\"por aqui paso\")\n flow.set(\"matricula_revisada\", true);\n flow.set(\"matricula_autorizada\", msg.payload.registrada)\n if(msg.payload.registrada){ // la matricula esta registrada y por lo tanto autorizada\n //node.warn(\"pma = \" + msg.payload.pma + \" tara = \" + msg.payload.tara)\n flow.set(\"pma\", msg.payload.pma)\n flow.set(\"tara\", msg.payload.tara)\n flow.set(\"entransito\", msg.payload.transito)\n flow.set(\"tipo_movimiento\", msg.payload.transito ? \"final\" : \"inicial\");// Si esta en transito = final en caso contrario = inicial\n if (msg.payload.aviso_identificacion){ // si la matricula existe una sola vez en Matriculas_Identificadores y la descripcion tiene coma, hay que sacar anuncion de identificacion\n flow.set(\"window_men_m3\", flow.get(\"men_identificacion\")); \n }\n if (!flow.get(\"entransito\")){\n \n }\n }\n }\n \n //******************************** RESPUESTA DE REVISION DEL CODIGO DE LA TARJETA RFID EN BD *****************************\n if (msg.payload.hasOwnProperty(\"rfid_revisado\")) {\n flow.set(\"RFID_revisado\", msg.payload.rfid_revisado);\n flow.set(\"RFID_verificado\", msg.payload.rfid_verificado);\n //*************Si la tarjeta existe recuperamos los datos asociados ***************************\n if(msg.payload.rfid_verificado){\n flow.set(\"cliente\", msg.payload.cliente)\n flow.set(\"residuo\", msg.payload.residuo)\n flow.set(\"matricula\", msg.payload.matricula)\n if (flow.get(\"matricula\")) {\n flow.set(\"matricula_autorizada\", true) // matricula esta autorizada en BD\n }\n }\n }\n\n //******************************** RESPUESTA DE REVISION DEL CODIGO QR EN BD *****************************\n if (msg.payload.hasOwnProperty(\"qr_revisado\")) {\n flow.set(\"QR_revisado\", msg.payload.qr_revisado);\n flow.set(\"QR_verificado\", msg.payload.qr_verificado);\n //*************Si el codigo QR existe recuperamos los datos asociados ***************************\n if(msg.payload.qr_verificado){\n flow.set(\"cliente\", msg.payload.cliente)\n flow.set(\"residuo\", msg.payload.residuo)\n if (flow.get(\"matricula\") == msg.payload.matricula){ // si la matricula coincide con la leida damos por finalizado el chequeo de matricula\n flow.set(\"matricula_formato_flag\", true) // indica matricula esta en formato\n flow.set(\"matricula_ok_flag\", true)\n flow.set(\"matricula_revisada\", true) //se ha revisado la existencia de la matricula en BD\n flow.set(\"matricula_autorizada\", true) // matricula autorizada\n \n }\n else{\n // Si la matricula es diferente tomamos como matricula la recibida de la BD\n // Ahora tenemos que confirmar si esa matricula esta en transito para saber el tipo de movimiento que vamos agestionar en esta pesada\n //por lo tanto ponemos los flags para que pueda volver a buscar la matricula en BD.\n flow.set(\"matricula_revisada\", false) // Se pone en false para volver a revisar la matricula correcta\n //node.warn(\"matricula leida = \" + flow.get(\"matricula\") + \" ; matricula del qr = \" + msg.payload.matricula)\n flow.set(\"matricula_autorizada\", false) // matricula autorizada\n flow.set(\"matriculacheck_solicitada\", false) // para poder volver a consultar una matricula\n flow.set(\"matricula_formato_flag\", true) // indica matricula esta en formato\n flow.set(\"matricula_ok_flag\", true) // aseguramos que la matricula puede ser buscada en la base de datos en el nodo matricula\n flow.set(\"matricula_leida_flag\", true) // aseguramos que la matricula puede ser buscada en la base de datos en el nodo matricula\n flow.set(\"matricula\", msg.payload.matricula) // guardamos la matricula correcta\n }\n \n }\n }\n\n //--------------------- Recepcion de la lista de materiales para el menu -------------------------\n\n if (msg.payload.hasOwnProperty(\"lista\") && msg.payload.hasOwnProperty(\"encabezado_lista\") && flow.get(\"menu_activo\")) {\n flow.set(\"lista_flag\", true)\n flow.set(\"encabezado_lista\", msg.payload.encabezado_lista)\n flow.set(\"lista_array\", msg.payload.lista)\n flow.set(\"menu_inicio\", msg.payload.menu_inicio)\n }\n else {\n \n flow.set(\"lista_flag\", false)\n \n }\n //---------------------- FIN de Recepcion de la lista de materiales para el menu ----------------------\n\n //---------------------- BOTONES EN LA PANTALLA -------------------------------------------------------\n if (msg.payload.hasOwnProperty(\"button\")) {\n flow.set(\"button\", msg.payload.button);\n }\n if (msg.payload.hasOwnProperty(\"button1\")) {\n flow.set(\"button1\", msg.payload.button1);\n }\n if (msg.payload.hasOwnProperty(\"button2\")) {\n flow.set(\"button2\", msg.payload.button2);\n }\n //************** APAGADO / ENCENDIDO DE LA PANTALLA ******************************** \n if (msg.payload.hasOwnProperty(\"screenOn_flag\")){\n flow.set(\"screenOn_flag\", msg.payload.screenOn_flag);\n if(msg.payload.screenOn_flag){\n \n node.send([null, {\"payload\":\"sudo echo 0 > /sys/class/backlight/rpi_backlight/bl_power\"}]);\n //node.send([null, {\"payload\":\"xset -display :0 dpms force on\"}]);\n }\n else{\n node.send([null, {\"payload\":\"sudo echo 1 > /sys/class/backlight/rpi_backlight/bl_power\"}]);\n //node.send([null, {\"payload\":\"xset -display :0 dpms force off\"}]);\n }\n }\n // **********************************************************\n if (msg.payload.hasOwnProperty(\"modo_totem\")){ // chequea si cambiamos el modo de trabajo del totem\n flow.set(\"modo_totem\", msg.payload.modo_totem);\n }\n if (msg.payload.hasOwnProperty(\"uso_detector_ok\")){ \n flow.set(\"uso_detector_ok\", msg.payload.uso_detector_ok);\n }\n \n \n if (msg.payload.hasOwnProperty(\"badplate\")){ // chequea si tenemos que pedir corrección de matricula\n flow.set(\"badplate\", msg.payload.badplate);\n }\n \n //------------------------ Hacer display de un BOTON de VALIDACION a la salida ------------------------\n/* \n if (msg.payload.hasOwnProperty(\"botonsalida\")){ // chequea si tenemos que pedir boton de salida en pantalla\n flow.set(\"botonsalida\", msg.payload.botonsalida);\n if (msg.payload.hasOwnProperty(\"botonsalida_txt\")){\n flow.set(\"botonsalida_txt\", msg.payload.botonsalida_txt);\n }\n if (msg.payload.hasOwnProperty(\"botonsalida_color\")){\n flow.set(\"botonsalida_color\", msg.payload.botonsalida_color);\n }\n if (msg.payload.hasOwnProperty(\"botonsalida_txt_color\")){\n flow.set(\"botonsalida_txt_color\", msg.payload.botonsalida_txt_color);\n }\n if (msg.payload.hasOwnProperty(\"botonsalida_mensaje1\")){\n flow.set(\"botonsalida_mensaje1\", msg.payload.botonsalida_mensaje1);\n }\n }\n*/\n //*********************************** RESET REMOTO *****************************************************\n if (msg.payload.hasOwnProperty(\"reboot_flag\")){ // comando para resetear el dispositivo desde el supervisor\n \n if(msg.payload.reboot_flag){ \n node.send([null, {payload:\"sudo shutdown -r now\"}]);\n }\n \n }\n //===================== deteccion de comando para iniciar la configuración ===========================================================\n if (msg.payload.hasOwnProperty(\"init_config\")) {\n if (msg.payload.init_config == true){\n node.send([null, null, {payload: 1}])\n }\n }\n \n //===================== deteccion de comando para gestionar semaforo ===========================================================\n if (msg.payload.hasOwnProperty(\"semaforoabierto\")) {\n if (msg.payload.semaforoabierto == true) {\n flow.set(\"semaforo\", \"green\")\n flow.set(\"semaforoabierto\", true) \n }\n else{\n flow.set(\"semaforo\", \"red\")\n flow.set(\"semaforoabierto\", false) \n }\n }\n \n //===================== deteccion de comando para abrir barrera ===========================================================\n if (msg.payload.hasOwnProperty(\"abrirbarrera\")) {\n if (msg.payload.abrirbarrera == true) {\n node.send([ null, null, null, { payload: 0 }])\n setTimeout(function () {\n node.send([null, null, null, { payload: 1 }])\n }, flow.get(\"relay2_pulse\"));\n }\n \n }\n //=====================================================================================================================================\n \n \n \n \n \nmsg = {payload: 1};\nreturn msg\n}\nelse{\n\n return // en caso de no ser el mensaje para este dispositivo no enviamos mensaje al proximo nodo, de esa manera no habra ninguna respuesta de este dispositivo\n}\n\n", + "func": "if ((msg.payload.totem_id == flow.get(\"totem_id\") || msg.payload.totem_id == \"*\") && msg.payload.numero_vial == flow.get(\"numero_vial\")) { // verifica que los datos son para este totem\n//if (msg.payload.numero_vial == flow.get(\"numero_vial\")) { // verifica que los datos son para este vial \n //guarda los elementos JSON recibidos del supervisor\n /*\n if (msg.payload.hasOwnProperty(\"numero_vial\")){\n flow.set(\"numero_vial\", msg.payload.numero_vial);\n }\n */\n if (msg.payload.hasOwnProperty(\"peso\")){\n flow.set(\"peso\", msg.payload.peso);\n \n }\n if (flow.get(\"supervisor\")) {\n if (msg.payload.hasOwnProperty(\"peso_estable\")) {\n flow.set(\"peso_estable\", msg.payload.peso_estable);\n }\n if (msg.payload.hasOwnProperty(\"peso_estable_flag\")) {\n flow.set(\"peso_estable_flag\", msg.payload.peso_estable_flag);\n }\n if (msg.payload.hasOwnProperty(\"fin_pesada_flag\")) {\n flow.set(\"fin_pesada_flag\", msg.payload.fin_pesada_flag);\n }\n if (msg.payload.hasOwnProperty(\"firma_cmd_flag\")) {\n flow.set(\"firma_cmd_flag\", msg.payload.firma_cmd_flag);\n flow.set(\"firma_flag\", true);\n }\n if (msg.payload.hasOwnProperty(\"remover_firma\")) {\n flow.set(\"remover_firma\", msg.payload.remover_firma);\n }\n if (msg.payload.hasOwnProperty(\"id_leido\")) {\n flow.set(\"id_leido\", msg.payload.id_leido);\n }\n if (msg.payload.hasOwnProperty(\"id_no_leido\")) {\n flow.set(\"id_no_leido\", msg.payload.id_no_leido);\n }\n if (msg.payload.hasOwnProperty(\"id_tarjeta\")) {\n flow.set(\"id_tarjeta\", msg.payload.id_tarjeta);\n }\n if (msg.payload.hasOwnProperty(\"matricula\")) {\n flow.set(\"matricula\", msg.payload.matricula);\n }\n \n }\n //****************************** RESPUESTA DE LA REVISION DE LA MATRICULA EN BD *******************************************\n if (msg.payload.hasOwnProperty(\"registrada\")) {\n //node.warn(\"por aqui paso\")\n flow.set(\"matricula_revisada\", true);\n flow.set(\"matricula_autorizada\", msg.payload.registrada)\n if(msg.payload.registrada){ // la matricula esta registrada y por lo tanto autorizada\n //node.warn(\"pma = \" + msg.payload.pma + \" tara = \" + msg.payload.tara)\n flow.set(\"pma\", msg.payload.pma)\n flow.set(\"tara\", msg.payload.tara)\n flow.set(\"entransito\", msg.payload.transito)\n flow.set(\"tipo_movimiento\", msg.payload.transito ? \"final\" : \"inicial\");// Si esta en transito = final en caso contrario = inicial\n if (msg.payload.aviso_identificacion){ // si la matricula existe una sola vez en Matriculas_Identificadores y la descripcion tiene coma, hay que sacar anuncio de identificacion\n flow.set(\"window_men_m3\", flow.get(\"men_identificacion\")); \n }\n if (!flow.get(\"entransito\")){\n \n }\n }\n }\n \n //******************************** RESPUESTA DE REVISION DEL CODIGO DE LA TARJETA RFID EN BD *****************************\n if (msg.payload.hasOwnProperty(\"rfid_revisado\")) {\n flow.set(\"RFID_revisado\", msg.payload.rfid_revisado);\n flow.set(\"RFID_verificado\", msg.payload.rfid_verificado);\n //*************Si la tarjeta existe recuperamos los datos asociados ***************************\n if(msg.payload.rfid_verificado){\n flow.set(\"cliente\", msg.payload.cliente)\n flow.set(\"residuo\", msg.payload.residuo)\n // Para el caso de RFID recibimos la matricula asociada a la tarjeta\n flow.set(\"matricula\", msg.payload.matricula)\n if (flow.get(\"matricula\")) {\n flow.set(\"matricula_autorizada\", true) // matricula esta autorizada en BD\n }\n \n }\n }\n\n //******************************** RESPUESTA DE REVISION DEL CODIGO QR EN BD *****************************\n if (msg.payload.hasOwnProperty(\"qr_revisado\")) {\n flow.set(\"QR_revisado\", msg.payload.qr_revisado);\n flow.set(\"QR_verificado\", msg.payload.qr_verificado);\n //*************Si el codigo QR existe recuperamos los datos asociados ***************************\n if(msg.payload.qr_verificado){\n flow.set(\"cliente\", msg.payload.cliente)\n flow.set(\"residuo\", msg.payload.residuo)\n\n /* Este codigo era para verificar la matricula pero ahora el QR no esta asociado a matricula\n if (flow.get(\"matricula\") == msg.payload.matricula){ // si la matricula coincide con la leida damos por finalizado el chequeo de matricula\n flow.set(\"matricula_formato_flag\", true) // indica matricula esta en formato\n flow.set(\"matricula_ok_flag\", true)\n flow.set(\"matricula_revisada\", true) //se ha revisado la existencia de la matricula en BD\n flow.set(\"matricula_autorizada\", true) // matricula autorizada\n \n }\n else{\n // Si la matricula es diferente tomamos como matricula la recibida de la BD\n // Ahora tenemos que confirmar si esa matricula esta en transito para saber el tipo de movimiento que vamos agestionar en esta pesada\n //por lo tanto ponemos los flags para que pueda volver a buscar la matricula en BD.\n flow.set(\"matricula_revisada\", false) // Se pone en false para volver a revisar la matricula correcta\n //node.warn(\"matricula leida = \" + flow.get(\"matricula\") + \" ; matricula del qr = \" + msg.payload.matricula)\n flow.set(\"matricula_autorizada\", false) // matricula autorizada\n flow.set(\"matriculacheck_solicitada\", false) // para poder volver a consultar una matricula\n flow.set(\"matricula_formato_flag\", true) // indica matricula esta en formato\n flow.set(\"matricula_ok_flag\", true) // aseguramos que la matricula puede ser buscada en la base de datos en el nodo matricula\n flow.set(\"matricula_leida_flag\", true) // aseguramos que la matricula puede ser buscada en la base de datos en el nodo matricula\n flow.set(\"matricula\", msg.payload.matricula) // guardamos la matricula correcta\n }\n */\n }\n }\n\n //--------------------- Recepcion de la lista de materiales para el menu -------------------------\n\n if (msg.payload.hasOwnProperty(\"lista\") && msg.payload.hasOwnProperty(\"encabezado_lista\") && flow.get(\"menu_activo\")) {\n flow.set(\"lista_flag\", true)\n flow.set(\"encabezado_lista\", msg.payload.encabezado_lista)\n flow.set(\"lista_array\", msg.payload.lista)\n flow.set(\"menu_inicio\", msg.payload.menu_inicio)\n }\n else {\n \n flow.set(\"lista_flag\", false)\n \n }\n //---------------------- FIN de Recepcion de la lista de materiales para el menu ----------------------\n\n //---------------------- BOTONES EN LA PANTALLA -------------------------------------------------------\n if (msg.payload.hasOwnProperty(\"button\")) {\n flow.set(\"button\", msg.payload.button);\n }\n if (msg.payload.hasOwnProperty(\"button1\")) {\n flow.set(\"button1\", msg.payload.button1);\n }\n if (msg.payload.hasOwnProperty(\"button2\")) {\n flow.set(\"button2\", msg.payload.button2);\n }\n //************** APAGADO / ENCENDIDO DE LA PANTALLA ******************************** \n if (msg.payload.hasOwnProperty(\"screenOn_flag\")){\n flow.set(\"screenOn_flag\", msg.payload.screenOn_flag);\n if(msg.payload.screenOn_flag){\n \n node.send([null, {\"payload\":\"sudo echo 0 > /sys/class/backlight/rpi_backlight/bl_power\"}]);\n //node.send([null, {\"payload\":\"xset -display :0 dpms force on\"}]);\n }\n else{\n node.send([null, {\"payload\":\"sudo echo 1 > /sys/class/backlight/rpi_backlight/bl_power\"}]);\n //node.send([null, {\"payload\":\"xset -display :0 dpms force off\"}]);\n }\n }\n // **********************************************************\n if (msg.payload.hasOwnProperty(\"modo_totem\")){ // chequea si cambiamos el modo de trabajo del totem\n flow.set(\"modo_totem\", msg.payload.modo_totem);\n }\n if (msg.payload.hasOwnProperty(\"uso_detector_ok\")){ \n flow.set(\"uso_detector_ok\", msg.payload.uso_detector_ok);\n }\n \n \n if (msg.payload.hasOwnProperty(\"badplate\")){ // chequea si tenemos que pedir corrección de matricula\n flow.set(\"badplate\", msg.payload.badplate);\n }\n \n //------------------------ Hacer display de un BOTON de VALIDACION a la salida ------------------------\n/* \n if (msg.payload.hasOwnProperty(\"botonsalida\")){ // chequea si tenemos que pedir boton de salida en pantalla\n flow.set(\"botonsalida\", msg.payload.botonsalida);\n if (msg.payload.hasOwnProperty(\"botonsalida_txt\")){\n flow.set(\"botonsalida_txt\", msg.payload.botonsalida_txt);\n }\n if (msg.payload.hasOwnProperty(\"botonsalida_color\")){\n flow.set(\"botonsalida_color\", msg.payload.botonsalida_color);\n }\n if (msg.payload.hasOwnProperty(\"botonsalida_txt_color\")){\n flow.set(\"botonsalida_txt_color\", msg.payload.botonsalida_txt_color);\n }\n if (msg.payload.hasOwnProperty(\"botonsalida_mensaje1\")){\n flow.set(\"botonsalida_mensaje1\", msg.payload.botonsalida_mensaje1);\n }\n }\n*/\n //*********************************** RESET REMOTO *****************************************************\n if (msg.payload.hasOwnProperty(\"reboot_flag\")){ // comando para resetear el dispositivo desde el supervisor\n \n if(msg.payload.reboot_flag){ \n node.send([null, {payload:\"sudo shutdown -r now\"}]);\n }\n \n }\n //===================== deteccion de comando para iniciar la configuración ===========================================================\n if (msg.payload.hasOwnProperty(\"init_config\")) {\n if (msg.payload.init_config == true){\n node.send([null, null, {payload: 1}])\n }\n }\n \n //===================== deteccion de comando para gestionar semaforo ===========================================================\n if (msg.payload.hasOwnProperty(\"semaforoabierto\")) {\n if (msg.payload.semaforoabierto == true) {\n flow.set(\"semaforo\", \"green\")\n flow.set(\"semaforoabierto\", true) \n }\n else{\n flow.set(\"semaforo\", \"red\")\n flow.set(\"semaforoabierto\", false) \n }\n }\n \n //===================== deteccion de comando para abrir barrera ===========================================================\n if (msg.payload.hasOwnProperty(\"abrirbarrera\")) {\n if (msg.payload.abrirbarrera == true) {\n node.send([ null, null, null, { payload: 0 }])\n setTimeout(function () {\n node.send([null, null, null, { payload: 1 }])\n }, flow.get(\"relay2_pulse\"));\n }\n \n }\n //=====================================================================================================================================\n \n \n \n \n \nmsg = {payload: 1};\nreturn msg\n}\nelse{\n\n return // en caso de no ser el mensaje para este dispositivo no enviamos mensaje al proximo nodo, de esa manera no habra ninguna respuesta de este dispositivo\n}\n\n", "outputs": 4, "timeout": "", "noerr": 0, @@ -3564,7 +3562,7 @@ "z": "953e8740401d175c", "g": "646bdfb9988a1708", "name": "Envio de mensajes", - "func": "// Este nodo realiza todos los envios de mensajes a los diferentes destinos: websocket, pantalla, relay\n\nif ((msg.id_topic == \"rfid\" || msg.id_topic == \"QR\") && flow.get(\"totem_master\")) { // si el mensaje proviene del lector de ID\n\n if (flow.get(\"RFID_ok_flag\") || flow.get(\"QR_ok_flag\")) {\n if(flow.get(\"QR_verificado\") || flow.get(\"RFID_verificado)\")){\n flow.set(\"window_id_m4\", flow.get(\"id_leido\"));\n flow.set(\"window_men_m3\", \"\")\n }\n //flow.set(\"QR_ok_flag\", false)\n //flow.set(\"RFID_ok_flag\", false)\n if (flow.get(\"peso_bajo_flag\")) {\n // para el caso cuando queremos enviar tarjetas para asignar usuario en la base de datos\n //flow.set(\"window_id_m4\", flow.get(\"id_tarjeta\"));\n msg = {};\n setTimeout(function () {\n //node.warn(\"erase window\")\n //flow.set(\"QR_ok_flag\", false)\n //flow.set(\"RFID_ok_flag\", false)\n flow.set(\"window_id_m4\", \"\");\n // ================================== configura mensaje para las ventanas de la pantalla ===========================\n var msg_display = { \"id_m1\": \"\", \"id_m2\": \"\", \"id_m3\": \"\", \"id_m4\": \"\", \"men_m1\": \"\", \"men_m2\": \"\", \"men_m3\": \"\", \"peso\": \"\" };\n msg_display.id_m1 = flow.get(\"id_titulo_matricula\");\n msg_display.id_m2 = flow.get(\"matricula\");\n msg_display.id_m3 = flow.get(\"id_titulo_id\");\n msg_display.id_m4 = flow.get(\"window_id_m4\");\n\n msg_display.men_m1 = flow.get(\"window_men_m1\");\n msg_display.men_m2 = flow.get(\"window_men_m2\");\n msg_display.men_m3 = flow.get(\"window_men_m3\");\n\n msg_display.peso = flow.get(\"peso\");\n //asignamos el valor real del color del semaforo, este valor se define en el archivo de configuración\n if (flow.get(\"semaforo\") == \"green\") {\n msg_display.semaforo = flow.get(\"semaforo_green_color\")\n }\n else {\n msg_display.semaforo = flow.get(\"semaforo_red_color\")\n }\n\n\n // ==================================================================================================================\n node.send([msg_display, null, null, null])\n }, 3000)\n }\n\n\n }\n else {\n if (flow.get(\"vehiculo_presente_flag\")) {\n flow.set(\"window_id_m4\", flow.get(\"id_no_leido\"));\n }\n else {\n\n }\n\n\n }\n}\n//============================================== Chequea si Fin de Pesada y Saca Mensaje ===========================================\nif (flow.get(\"fin_pesada_flag\") && flow.get(\"totem_master\")) {\n setTimeout(() => {\n node.send([null, null, null, { payload: \"fin_pesada\" }]) // salida de audio de FIN DE PESADA <----\n }, 500);\n flow.set(\"fin_pesada_flag\", false) // evitamos que en esta pesada vuelva a entrar aqui nuevamente\n flow.set(\"semaforo\", \"green\")\n // sacar comando para barrera si esta se encuentra habilitada\n node.send([null, { payload: 1 }, null, null])\n if (flow.get(\"barrera_habilitada\")) {\n setTimeout(function () {\n node.send([null, { payload: 0 }, null, null])\n }, flow.get(\"relay2_pulse\"));\n }\n //flow.set(\"peso_estable_flag\", false)\n flow.set(\"botonsalida\", false)\n //coloca los mensajes para mostrar en pantalla \n flow.set(\"window_men_m1\", flow.get(\"men_pesaje_listo\"));\n flow.set(\"window_men_m2\", flow.get(\"men_salida\"));\n flow.set(\"window_men_m3\", \"\");\n}\n//===================================================================================================================== \n\n\n// ================================== configura mensaje para las ventanas de la pantalla ===========================\nvar msg_display = { \"id_m1\": \"\", \"id_m2\": \"\", \"id_m3\": \"\", \"id_m4\": \"\", \"men_m1\": \"\", \"men_m2\": \"\", \"men_m3\": \"\", \"peso\": \"\" };\nmsg_display.id_m1 = flow.get(\"id_titulo_matricula\");\nmsg_display.id_m2 = flow.get(\"matricula\");\nmsg_display.id_m3 = flow.get(\"id_titulo_id\");\nmsg_display.id_m4 = flow.get(\"window_id_m4\");\n\nmsg_display.men_m1 = flow.get(\"window_men_m1\");\nmsg_display.men_m2 = flow.get(\"window_men_m2\");\nmsg_display.men_m3 = flow.get(\"window_men_m3\");\n\nmsg_display.peso = flow.get(\"peso\");\n//asignamos el valor real del color del semaforo, este valor se define en el archivo de configuración\nmsg_display.semaforo = flow.get(\"semaforo\");\nif (flow.get(\"semaforo\") == \"green\") {\n msg_display.semaforo = flow.get(\"semaforo_green_color\")\n}\nelse {\n msg_display.semaforo = flow.get(\"semaforo_red_color\")\n}\nmsg_display.titulo_matricula_color = flow.get(\"titulo_matricula_color\") // color del texto del titulo de Matricula y del ID. Definido en el archivo de configuracion\nmsg_display.valor_matricula_color = flow.get(\"valor_matricula_color\") // color del texto del valor de la Matricula y del ID. Definido en el archivo de configuracion\nmsg_display.men_m1_color = \"#cc0000\" // color del mensaje de \"peso estable\" en la ventana W2\nmsg_display.men_m2_color = \"#6B3C01\" // color del mensaje de \"puede mover el vehiculo\" en la ventana W2\nmsg_display.men_m3_color = \"#386B01\" // color del mensaje de \"acerque tarjeta de ID\" en la ventana W2\n\n//============================Procesamiento botones en pantalla ======================================================\nif (flow.get(\"totem_master\")) {\n if (flow.get(\"startmenu_flag\")) { // check si tenemos que poner boton de solicitud de primer menu\n if (flow.get(\"button\") != undefined) {\n msg_display.button = flow.get(\"button\")\n }\n else {\n msg_display.button = \"button1\"\n }\n if (flow.get(\"button1\") != undefined) {\n msg_display.button1 = flow.get(\"button1\")\n }\n else {\n msg_display.button1 = \"COMPLETAR INFO.\"\n }\n if (flow.get(\"button2\") != undefined) {\n msg_display.button2 = flow.get(\"button2\")\n }\n else {\n msg_display.button2 = \"OK.\"\n }\n if (flow.get(\"men_linea1\") != undefined) {\n msg_display.men_m1 = flow.get(\"men_linea1\")\n }\n else {\n msg_display.men_m1 = \"Haga CLICK ABAJO\"\n }\n if (flow.get(\"men_linea2\") != undefined) {\n msg_display.men_m2 = flow.get(\"men_linea2\")\n }\n else {\n msg_display.men_m2 = \"\"\n }\n\n msg_display.men_m1_color = flow.get(\"men_linea1_color\")\n msg_display.men_m2_color = flow.get(\"men_linea2_color\")\n //flow.set(\"startmenu_flag\", false) // boton de solicitud de primer menu ejecutado\n // Este flag \"startmenu_flag\" debe ser puesto a false luego de haber sacado el menu o pasado la tarjeta\n // ya que si se pone a false antes de tocar el boton y viene otro valor de peso el boton desaparece de la pantalla\n }\n else {\n msg_display.button = \"message\"\n }\n // ==================================================================================================================\n\n //------------------------------ BOTON de VALIDACION ----------------------------------------------------------------\n if (flow.get(\"botonsalida\")) { // check si tenemos que poner boton de validacion a la salida. Si movimiento final siempre lo ponemos\n\n msg_display.button = \"button3\" // hace display de un boton de validacion\n\n // ------------ chequea si tenemos color del background del boton de validacion ---------------\n if (flow.get(\"botonsalida_color\") != undefined) {\n msg_display.botonvalidacion_background = flow.get(\"botonsalida_color\")\n }\n else {\n msg_display.botonvalidacion_background = flow.get(\"botonsalida_color_def\")\n }\n\n // ------------ chequea si tenemos color del texto del boton de validacion -----------------\n if (flow.get(\"botonsalida_txt_color\") != undefined) {\n msg_display.botonvalidacion_foreground = flow.get(\"botonsalida_txt_color\")\n }\n else {\n msg_display.botonvalidacion_foreground = flow.get(\"botonsalida_txt_color_def\")\n }\n\n // ------------ chequea si tenemos texto del boton de validacion -----------------\n if (flow.get(\"botonsalida_txt\") != undefined) {\n msg_display.button3 = flow.get(\"botonsalida_txt\")\n }\n else {\n msg_display.button3 = flow.get(\"botonsalida_txt_def\")\n }\n\n // ------------ chequea si tenemos texto del mensaje antes del boton de validacion ----------------- \n if (flow.get(\"botonsalida_mensaje1\") != undefined) {\n msg_display.men_m1 = flow.get(\"botonsalida_mensaje1\")\n }\n else {\n msg_display.men_m1 = flow.get(\"botonsalida_mensaje1_def\")\n }\n\n\n }\n\n}\n\n// ==================================================================================================================\nnode.send([msg_display, null, null, null])\n\n// ****************gestion del relay del semaforo****************\nif (flow.get(\"semaforo\") == \"green\") {\n node.send([null, null, { \"payload\": 1 }, null]);\n}\nelse {\n node.send([null, null, { \"payload\": 0 }, null]);\n}\n//*****************************************************************\n\nreturn;", + "func": "// Este nodo realiza todos los envios de mensajes a los diferentes destinos: websocket, pantalla, relay\n\nif ((msg.id_topic == \"rfid\" || msg.id_topic == \"QR\") && flow.get(\"totem_master\")) { // si el mensaje proviene del lector de ID\n\n if (flow.get(\"RFID_ok_flag\") || flow.get(\"QR_ok_flag\")) {\n if(flow.get(\"QR_verificado\") || flow.get(\"RFID_verificado)\")){\n flow.set(\"window_id_m4\", flow.get(\"id_leido\"));\n flow.set(\"window_men_m3\", \"\")\n }\n //flow.set(\"QR_ok_flag\", false)\n //flow.set(\"RFID_ok_flag\", false)\n if (flow.get(\"peso_bajo_flag\")) {\n // para el caso cuando queremos enviar tarjetas para asignar usuario en la base de datos\n //flow.set(\"window_id_m4\", flow.get(\"id_tarjeta\"));\n msg = {};\n setTimeout(function () {\n //node.warn(\"erase window\")\n //flow.set(\"QR_ok_flag\", false)\n //flow.set(\"RFID_ok_flag\", false)\n flow.set(\"window_id_m4\", \"\");\n // ================================== configura mensaje para las ventanas de la pantalla ===========================\n var msg_display = { \"id_m1\": \"\", \"id_m2\": \"\", \"id_m3\": \"\", \"id_m4\": \"\", \"men_m1\": \"\", \"men_m2\": \"\", \"men_m3\": \"\", \"peso\": \"\" };\n msg_display.id_m1 = flow.get(\"id_titulo_matricula\");\n msg_display.id_m2 = flow.get(\"matricula\");\n msg_display.id_m3 = flow.get(\"id_titulo_id\");\n msg_display.id_m4 = flow.get(\"window_id_m4\");\n\n msg_display.men_m1 = flow.get(\"window_men_m1\");\n msg_display.men_m2 = flow.get(\"window_men_m2\");\n msg_display.men_m3 = flow.get(\"window_men_m3\");\n\n msg_display.peso = flow.get(\"peso\");\n //asignamos el valor real del color del semaforo, este valor se define en el archivo de configuración\n if (flow.get(\"semaforo\") == \"green\") {\n msg_display.semaforo = flow.get(\"semaforo_green_color\")\n }\n else {\n msg_display.semaforo = flow.get(\"semaforo_red_color\")\n }\n\n\n // ==================================================================================================================\n node.send([msg_display, null, null, null])\n }, 3000)\n }\n\n\n }\n else {\n if (flow.get(\"vehiculo_presente_flag\")) {\n flow.set(\"window_id_m4\", flow.get(\"id_no_leido\"));\n }\n else {\n\n }\n\n\n }\n}\n//============================================== Chequea si Fin de Pesada y Saca Mensaje ===========================================\nif (flow.get(\"fin_pesada_flag\") && flow.get(\"totem_master\")) {\n setTimeout(() => {\n node.send([null, null, null, { payload: \"fin_pesada\" }]) // salida de audio de FIN DE PESADA <----\n }, 500);\n flow.set(\"fin_pesada_flag\", false) // evitamos que en esta pesada vuelva a entrar aqui nuevamente\n flow.set(\"semaforo\", \"green\")\n // sacar comando para barrera si esta se encuentra habilitada\n //node.send([null, { payload: 1 }, null, null])\n if (flow.get(\"barrera_habilitada\")) {\n node.send([null, { payload: 0 }, null, null])\n setTimeout(function () {\n node.send([null, { payload: 1 }, null, null])\n }, flow.get(\"relay2_pulse\"));\n }\n //flow.set(\"peso_estable_flag\", false)\n flow.set(\"botonsalida\", false)\n //coloca los mensajes para mostrar en pantalla \n flow.set(\"window_men_m1\", flow.get(\"men_pesaje_listo\"));\n flow.set(\"window_men_m2\", flow.get(\"men_salida\"));\n flow.set(\"window_men_m3\", \"\");\n}\n//===================================================================================================================== \n\n\n// ================================== configura mensaje para las ventanas de la pantalla ===========================\nvar msg_display = { \"id_m1\": \"\", \"id_m2\": \"\", \"id_m3\": \"\", \"id_m4\": \"\", \"men_m1\": \"\", \"men_m2\": \"\", \"men_m3\": \"\", \"peso\": \"\" };\nif (!flow.get(\"peso_bajo_flag\")) {\n msg_display.id_m2 = flow.get(\"matricula\");\n msg_display.id_m4 = flow.get(\"window_id_m4\");\n}\nelse{\n msg_display.id_m2 = \"\"\n msg_display.id_m4 = \"\"\n}\nmsg_display.id_m1 = flow.get(\"id_titulo_matricula\");\nmsg_display.id_m3 = flow.get(\"id_titulo_id\");\n\nmsg_display.men_m1 = flow.get(\"window_men_m1\");\nmsg_display.men_m2 = flow.get(\"window_men_m2\");\nmsg_display.men_m3 = flow.get(\"window_men_m3\");\n\nmsg_display.peso = flow.get(\"peso\");\n//asignamos el valor real del color del semaforo, este valor se define en el archivo de configuración\nmsg_display.semaforo = flow.get(\"semaforo\");\nif (flow.get(\"semaforo\") == \"green\") {\n msg_display.semaforo = flow.get(\"semaforo_green_color\")\n}\nelse {\n msg_display.semaforo = flow.get(\"semaforo_red_color\")\n}\nmsg_display.titulo_matricula_color = flow.get(\"titulo_matricula_color\") // color del texto del titulo de Matricula y del ID. Definido en el archivo de configuracion\nmsg_display.valor_matricula_color = flow.get(\"valor_matricula_color\") // color del texto del valor de la Matricula y del ID. Definido en el archivo de configuracion\nmsg_display.men_m1_color = \"#cc0000\" // color del mensaje de \"peso estable\" en la ventana W2\nmsg_display.men_m2_color = \"#6B3C01\" // color del mensaje de \"puede mover el vehiculo\" en la ventana W2\nmsg_display.men_m3_color = \"#386B01\" // color del mensaje de \"acerque tarjeta de ID\" en la ventana W2\n\n//============================Procesamiento botones en pantalla ======================================================\nif (flow.get(\"totem_master\")) {\n if (flow.get(\"startmenu_flag\")) { // check si tenemos que poner boton de solicitud de primer menu\n if (flow.get(\"button\") != undefined) {\n msg_display.button = flow.get(\"button\")\n }\n else {\n msg_display.button = \"button1\"\n }\n if (flow.get(\"button1\") != undefined) {\n msg_display.button1 = flow.get(\"button1\")\n }\n else {\n msg_display.button1 = \"COMPLETAR INFO.\"\n }\n if (flow.get(\"button2\") != undefined) {\n msg_display.button2 = flow.get(\"button2\")\n }\n else {\n msg_display.button2 = \"OK.\"\n }\n if (flow.get(\"men_linea1\") != undefined) {\n msg_display.men_m1 = flow.get(\"men_linea1\")\n }\n else {\n msg_display.men_m1 = \"Haga CLICK ABAJO\"\n }\n if (flow.get(\"men_linea2\") != undefined) {\n msg_display.men_m2 = flow.get(\"men_linea2\")\n }\n else {\n msg_display.men_m2 = \"\"\n }\n\n msg_display.men_m1_color = flow.get(\"men_linea1_color\")\n msg_display.men_m2_color = flow.get(\"men_linea2_color\")\n //flow.set(\"startmenu_flag\", false) // boton de solicitud de primer menu ejecutado\n // Este flag \"startmenu_flag\" debe ser puesto a false luego de haber sacado el menu o pasado la tarjeta\n // ya que si se pone a false antes de tocar el boton y viene otro valor de peso el boton desaparece de la pantalla\n }\n else {\n msg_display.button = \"message\"\n }\n // ==================================================================================================================\n\n //------------------------------ BOTON de VALIDACION ----------------------------------------------------------------\n if (flow.get(\"botonsalida\")) { // check si tenemos que poner boton de validacion a la salida. Si movimiento final siempre lo ponemos\n\n msg_display.button = \"button3\" // hace display de un boton de validacion\n\n // ------------ chequea si tenemos color del background del boton de validacion ---------------\n if (flow.get(\"botonsalida_color\") != undefined) {\n msg_display.botonvalidacion_background = flow.get(\"botonsalida_color\")\n }\n else {\n msg_display.botonvalidacion_background = flow.get(\"botonsalida_color_def\")\n }\n\n // ------------ chequea si tenemos color del texto del boton de validacion -----------------\n if (flow.get(\"botonsalida_txt_color\") != undefined) {\n msg_display.botonvalidacion_foreground = flow.get(\"botonsalida_txt_color\")\n }\n else {\n msg_display.botonvalidacion_foreground = flow.get(\"botonsalida_txt_color_def\")\n }\n\n // ------------ chequea si tenemos texto del boton de validacion -----------------\n if (flow.get(\"botonsalida_txt\") != undefined) {\n msg_display.button3 = flow.get(\"botonsalida_txt\")\n }\n else {\n msg_display.button3 = flow.get(\"botonsalida_txt_def\")\n }\n\n // ------------ chequea si tenemos texto del mensaje antes del boton de validacion ----------------- \n if (flow.get(\"botonsalida_mensaje1\") != undefined) {\n msg_display.men_m1 = flow.get(\"botonsalida_mensaje1\")\n }\n else {\n msg_display.men_m1 = flow.get(\"botonsalida_mensaje1_def\")\n }\n\n\n }\n\n}\n\n// ==================================================================================================================\nnode.send([msg_display, null, null, null])\n\n// ****************gestion del relay del semaforo****************\nif (flow.get(\"semaforo\") == \"green\") {\n node.send([null, null, { \"payload\": 1 }, null]);\n}\nelse {\n node.send([null, null, { \"payload\": 0 }, null]);\n}\n//*****************************************************************\n\nreturn;", "outputs": 4, "timeout": "", "noerr": 0, @@ -4170,7 +4168,7 @@ "z": "953e8740401d175c", "g": "646bdfb9988a1708", "name": "Codiciones Operacion", - "info": "Este sistema puede funcionar con un Totem o con dos Totems (bascula bidireccional).\nAl entrar el vehiculo en la bascula, este es detectado por el evento bascula, al superar el peso minimo,\ny/o por el detector de presencia de vehiculos situado en el Totem (remoto) por donde entra el vehiculo. Es de notar que \nsi hemos configurado la modalidad con dos Totem, el evento bascula no inicia el request del snapshot, en ese caso lo hace el detector.\nEstos eventos hacen que el Totem correspondiente genere un request de snapshot a la camara para leer la matricula del vehiculo entrante. \nSimultaneamente el evento bascula (peso > pmin) genera un UUID para abrir un movimiento en la bascula y lo rellena\ncon los parametros hasta ese momento conocidos como hora de entrada, nombre del totem, modo_Totem, UUID...\nAl llegar el resultado del snapshot, el RPi revisa si la matricula corresponde a una matricula bajo el formato correcto\nen cuyo caso se da por valida. En caso que NO sea valida, se revisa si el Totem ha sido habilitado para editar matriculas, si ese \nfuera el caso se saca en pantalla el editor de matriculas. En caso contrario se saca un mensaje en pantalla indicando que tiene que \ndar retroceso y volver a entrar. Existe un parametro configurable \"identificacion_especial\" que si esta habilitado permite continuar el proceso\nsin matricula, pero el conductor tendra obligatoriamente que identificarse con un QR o RFID. Una pantalla le indicara que debe presentarlo.\nUna vez que la matricula esta dentro del formato, revisamos si el Totem ha sido habilitado para mostrar el boton en pantalla \nde Validacion (o de salida), de manera que el conductor una vez frente al Totem pueda dar por concluida la pesada. \nEn este punto el Totem espera o un QR o un RFID o un Detector de vehiculo o un Boton de Validacion para poder seguir. Una vez detectado algunos de Estos\ncondiciones, el peso en ese momento en la bascula se recoge como peso estable. Para dar por finalizada tenemos que revisar si hay algunos\nparametro configurado como obligatorio por ejemplo es obligatorio presentar el QR y/o clicar el boton de Validacion, de manera que hasta \nque no se cumplan los obligatorios junto con las condiciones anteriores no se puede continuar. Una vez recibido el ultimo parametro\nobligatorio damos por finalizada la pesada y se pone el semaforo en Verde para que el vehiculo abandone la bascula.\nAl abandonar la bascula (peso < pmin) se hace el registro en Base de Datos, incluyendo ahora los datos recogidos como matricula, \nhora de salida, firma, etc. Adicionalmente se hace un intento de enviar el movimiento al servidor central y posteriormente se revisa en BD \nsi tenemos algun record que no ha sido aun sincronizado, en cuyo caso se procede a enviarlo al servidor para sincronizarlo. \n\n", + "info": "Este sistema puede funcionar con un Totem o con dos Totems (bascula bidireccional).\nAl entrar el vehiculo en la bascula, este es detectado por el evento bascula, al superar el peso minimo,\ny/o por el detector de presencia de vehiculos situado en el Totem (remoto) por donde entra el vehiculo. Es de notar que \nsi hemos configurado la modalidad con dos Totem, el evento bascula no inicia el request del snapshot, en ese caso lo hace el detector.\nEstos eventos hacen que el Totem correspondiente genere un request de snapshot a la camara para leer la matricula del vehiculo entrante. \nSimultaneamente el evento bascula (peso > pmin) genera un UUID para abrir un movimiento en la bascula y lo rellena\ncon los parametros hasta ese momento conocidos como hora de entrada, nombre del totem, modo_Totem, UUID...\nAl llegar el resultado del snapshot, el RPi revisa si la matricula corresponde a una matricula bajo el formato correcto\nen cuyo caso se da por valida. En caso que NO sea valida, se revisa si el Totem ha sido habilitado para editar matriculas, si ese \nfuera el caso se saca en pantalla el editor de matriculas. En caso contrario se saca un mensaje en pantalla indicando que tiene que \ndar retroceso y volver a entrar. En caso que el conductor presente una tarjeta rfid autorizada se puede continuar el proceso\nsin matricula.\nUna vez que la matricula esta dentro del formato, revisamos si el Totem ha sido habilitado para mostrar el boton en pantalla \nde Validacion (o de salida), de manera que el conductor una vez frente al Totem pueda dar por concluida la pesada. \nEn este punto el Totem espera o un QR o un RFID o un Detector de vehiculo o un Boton de Validacion para poder seguir. Una vez detectado algunos de Estos\ncondiciones, el peso en ese momento en la bascula se recoge como peso estable. Para dar por finalizada tenemos que revisar si hay algunos\nparametros configurados como obligatorio por ejemplo es obligatorio presentar el QR y/o clicar el boton de Validacion, de manera que hasta \nque no se cumplan los obligatorios junto con las condiciones anteriores no se puede continuar. Una vez recibido el ultimo parametro\nobligatorio damos por finalizada la pesada y se pone el semaforo en Verde para que el vehiculo abandone la bascula.\nAl momento de poner el semaforo en verde se envia el registro al supervisor para que lo registre en BD, incluyendo ahora los datos recogidos como matricula, \nhora de salida, firma, etc. \n\n", "x": 660, "y": 1440, "wires": [] @@ -4181,7 +4179,7 @@ "z": "953e8740401d175c", "g": "646bdfb9988a1708", "name": "Peso", - "func": "let peso = flow.get(\"peso\") || 0;\nconst peso_minimo = flow.get(\"peso_minimo\");\nlet peso_estable = flow.get(\"peso_estable\");\nlet semaforo = flow.get(\"semaforo\");\n\nif (peso < peso_minimo) {\n // evento de bascula OFF para cuando el totem no dispone de sensor remoto\n /* eliminamos este trigger para el evento de la bascula\n if (peso < (peso_minimo * 0.8) && flow.get(\"peso_trigger_ON\")) {// consideramos una histeresis\n flow.set(\"peso_trigger_ON\", false) // marcamos que el trigger ON esta en FALSE para proxima activacion de la bascula\n node.send([null, null, null, { payload: 1, topic: \"peso_OFF\" }, null, null, null, null])\n }\n */\n //============================================ AQUI SE HACE EL REGISTRO DEL MOVIMIENTO EN BD ===============================\n if(!flow.get(\"peso_bajo_flag\")){ // Se cumple solo una vez al vaciar la bascula\n /* if (flow.get(\"movimiento_registrado_flag\") && !flow.get(\"supervisor\") && flow.get(\"totem_master\") && (flow.get(\"tipo_movimiento\") != \"nodefinido\")){ \n let date = new Date();\n let timestamp = parseInt(date.getTime()/1000);\n flow.set(\"horasalida\", new Date(date.getTime()).toLocaleString()) // Convierte a formato legible\n \n let new_register = flow.get(\"register\")\n new_register.horasalida = flow.get(\"horasalida\")\n new_register.pesoestable = flow.get(\"peso_estable\")\n new_register.timestamp = timestamp\n //hay que revisar imagen, QR y RFID ya que no en todos los casos estan presentes\n \n let obj = new_register;\n delete obj.sincro\n new_register = obj\n new_register.imagen = flow.get(\"matricula_image\")\n if (flow.get(\"firma_obligatoria\")){ // cambiamos \"firma_habilitada\" por \"firma_obligatoria\"\n new_register.firma = flow.get(\"last_firma\")\n }\n\n //let msg_plate = { payload: flow.get(\"matricula_image\"), filename: flow.get(\"path_images\") + flow.get(\"nombre_imagen\") } // guardamos archivo con imagen en disco local\n \n //flow.set(\"register2API\", new_register) // guardamos el objeto json completo con imagen de matricula e imagen de firma \n \n flow.set(\"movimiento_registrado_flag\", false) // evitamos que podamos entrar en este espacio hasta nuevo registro\n\n // *********************** preparamos json con movimiento para enviar al supervisor local de la bascula *****************\n let msg_mov = { payload: {} }\n new_register.tara = flow.get(\"tara\")\n new_register.destareautomatico = flow.get(\"destareautomatico\")\n msg_mov.payload.device = \"supervisor\"\n msg_mov.payload.totem_id = flow.get(\"totem_id\")\n msg_mov.payload.accion = \"movimiento\"\n //msg_mov.payload.tipo = flow.get(\"modelo\") // entrada / salida\n msg_mov.payload.tipomovimiento = flow.get(\"tipo_movimiento\")\n msg_mov.payload.urlapi = flow.get(\"url_API\")\n msg_mov.payload.movimiento = new_register // enviamos el registro del movimiento con las imagenes de matricula y de firma\n //**************************************************************************************************************************\n\n node.send([null, null, null, { payload: 1, topic: \"peso_OFF\" }, null, null, null, msg_mov]) // envio del registro a BD y a la API y envio de evento bascula OFF\n\n flow.set(\"registro\", \"\") // inicializamos el registro para evitar cualquier posible duplicado en bd\n\n }\n */\n flow.set(\"matricula_image\", \"\") // inicializamos imagen del vehiculo\n flow.set(\"plate_sent\", false)\n flow.set(\"matricula_revisada\", false)\n flow.set(\"matricula_autorizada\", false)\n flow.set(\"last_firma\", \"\") // inicializamos imagen de la firma\n flow.set(\"identificacion_pendiente\", false) // estas cuatro lineas son relativas a la identificacion especial para cuando no se puede leer la matricula\n flow.set(\"identificacion_esp_aplicada\", false) // indica que la matricula no fue bien leida y se aplico el parametro de identificacion especial\n flow.set(\"QR_revisado\", false)\n flow.set(\"RFID_revisado\", false)\n flow.set(\"QR_verificado\", false)\n flow.set(\"RFID_verificado\", false)\n flow.set(\"peso_bajo_flag\", true)\n flow.set(\"matricula_leida_flag\", false)\n flow.set(\"matricula_formato_flag\", false)\n flow.set(\"snapshot_rq_flag\", false)\n flow.set(\"lista_array\", [])\n flow.set(\"menu0\", [])\n flow.set(\"menu1\", [])\n flow.set(\"menu2\", [])\n flow.set(\"menu_seleccionado_flag\", false)// indicador de que el usuario termino la seleccion en el menu y se envio\n flow.set(\"id_seleccionado\", \"no recibido\")\n flow.set(\"startmenu_flag\", false) // reset del flag que permite mostrar el boton (\"completar informacion\") de acceso al menu de materiales\n flow.set(\"editor_matricula_ok\", false) // se activa cuando el usuario hace clik en OK para ir a editar la matricula\n flow.set(\"badplate_llamado\", false) // se activa cuando se saca por primera vez la notificacion para EDITRA MATRICULA en la siguiente pantalla\n flow.set(\"nota_modifique_matricula_done\", false) // nota al usuario cuando hay que modificar matricula no registrada\n flow.set(\"nota_vuelva_intentar_done\", false) // nota al usuario despues de corregir la matricula en caso de error\n flow.set(\"nota_avise_basculista_done\", false) // nota al usuario de aviso al basculista\n flow.set(\"nota_resumen_mostrada\", false) // indica que la nota de resumen luego de presentar identificacion ya se mostro (nodo QR / RFID)\n flow.set(\"totem_master\", false) // flag para NO declarar peso estable si lo encontramos en false (ver nodo \"detector rx\") y para no enviar movimientos a Base de datos ni a servidor\n flow.set(\"matricula\", \"Sin Matricula\")\n flow.set(\"nombre_imagen\", \"sin-nombre-de-imagen\")\n flow.set(\"badplate\", false)\n flow.set(\"distance_flag_SET\", false)\n flow.set(\"semaforoabierto\", true) // flag para gestion del semaforo desde websocket\n //Atributos del vehiculo, leidos de la BD al momento de revisar si la matricula existe en BD\n flow.set(\"pma\", 0)\n flow.set(\"tara\", 0)\n flow.set(\"tipo_movimiento\", \"nodefinido\")\n flow.set(\"register\", {})\n flow.set(\"movimiento_enviado\", false)\n flow.set(\"matriculacheck_solicitada\", false) // flag utilizado para no repetir el envio de la revision de matricula en el nodo Matricula\n \n if (flow.get(\"switch_2_Totem_page\")) { //En caso que este flag haya sido habilitado en configuracion \n //eliminamos cualquier posible ventana de notificacion que haya quedado abierta y cambiamos a la ventana principal de Totem en caso de haber quedado otra ventana abierta\n \n node.send([null, null, null, null, null, { payload: \"\" }, { \"payload\": { \"tab\": \"Totem\" } }, null]);\n }\n else {\n //eliminamos cualquier posible ventana de notificacion que haya quedado abierta\n node.send([null, null, null, null, null, { payload: \"\" }, null, null]);\n }\n }\n //==========================================================================================================================\n flow.set(\"peso_estable_flag\", false)\n flow.set(\"peso_estable_audio_flag\", true)\n flow.set(\"peso_estable\", 0)\n flow.set(\"fin_pesada_flag\", false)\n //flow.set(\"totem_master\", false) // flag para NO declarar peso estable si lo encontramos en false (ver nodo \"detector rx\") y para no enviar movimientos a Base de datos ni a servidor\n if (flow.get(\"totem_qty\") == 1) { flow.set(\"totem_master\", true) } // en el caso de un solo totem. Este dispositivo siempre sera el master\n flow.set(\"firma_activa\", false)\n flow.set(\"QR_ok_flag\", false);\n flow.set(\"RFID_ok_flag\", false);\n flow.set(\"last_QR\", \"-\")\n flow.set(\"last_RFID\", \"-\")\n flow.set(\"botonsalida\", false)\n flow.set(\"vehiculo_en_posicion\", false)\n flow.set(\"salida_valida_flag\", false)\n \n flow.set(\"aviso_pma_hecho\", false) // reset del flag indicador de PMA\n //flow.set(\"matricula_leida_flag\", false)\n //flow.set(\"matricula_formato_flag\", false)\n flow.set(\"matricula_ok_flag\", false)\n flow.set(\"matricula_editada_flag\", false)\n //flow.set(\"matricula\", \"Sin Matricula\")\n //flow.set(\"snapshot_rq_flag\", false)\n //flow.set(\"nombre_imagen\", \"sin-nombre-de-imagen\")\n //flow.set(\"badplate\", false)\n flow.set(\"firma_ok_flag\", false)\n flow.set(\"movimiento_registrado_flag\", false)\n if (flow.get((\"semaforoabierto\"))){ // si el semaforo ha sido manipulado desde websocket entonces no lo tocamos\n flow.set(\"semaforo\", \"green\")\n }\n flow.set(\"window_men_m1\", \"\"); // borra posibles mensajes en pantalla \n flow.set(\"window_men_m2\", \"\"); \n flow.set(\"window_men_m3\", \"\");\n flow.set(\"window_id_m4\", \"\");\n flow.set(\"window_id_m2\", \"\");\n \n \n}\nelse {// ************************ peso > pmin *****************************************\n if (flow.get(\"peso_bajo_flag\")) {\n flow.set(\"peso_min_time\", new Date().getTime()) // marca momento en que se detecta peso > peso min\n //node.warn(\"peso_min_time = \" + flow.get(\"peso_min_time\"))\n flow.set(\"horaentrada\", new Date(flow.get(\"peso_min_time\")).toLocaleString()) // Convierte a formato legible\n // evento de bascula ON para cuando hay un solo Totem en la bascula (sin sensor remoto)\n /*\n if (flow.get(\"peso_trigger_ON\") == false) {\n flow.set(\"peso_trigger_ON\", true) // \n node.send([null, null, null, { payload: 1, topic: \"peso_ON\" }, null, null, null, null])\n }\n */\n node.send([null, null, null, { payload: 1, topic: \"peso_ON\" }, null, null, null, null]) // sacamos evento de bascula ON cuando no hay sensor remoto\n //flow.set(\"matricula_leida_flag\", false)\n //flow.set(\"matricula_formato_flag\", false)\n flow.set(\"matricula_ok_flag\", false)\n flow.set(\"badplate\", false) // inicializamos flag en caso que haya sido enviado cuando peso < pmin \n flow.set(\"vehiculo_presente_flag\", true);\n flow.set(\"ID_enviado\", false) // activamos flag para envio de un unico RFID / QR con peso > pmin\n flow.set(\"esperando_id\", true)\n flow.set(\"peso_bajo_flag\", false);\n\n flow.set(\"semaforo\", \"red\")\n node.send([{ payload: 1 }, null, null, null, null, null, null, null]) // generamos un nuevo UUID\n setTimeout(function () {\n let new_register = {\n uuid: flow.get(\"new_uuid\"),\n horaentrada: flow.get(\"horaentrada\"),\n vial: flow.get(\"numero_vial\"),\n totem: flow.get(\"totem_id\"),\n sincro: false,\n modo: flow.get(\"modo_totem\"),\n firmaobligatoria: flow.get(\"firma_obligatoria\"),\n id_seleccionado: \"no recibido\",\n nombre_firma: \"No Habilitada\",\n QR: \"-\",\n RFID: \"-\",\n matricula: \"Sin Matricula\",\n nombre_imagen: \"Sin Matricula\",\n sentido: \"No conocido\"\n }\n flow.set(\"register\", new_register)\n }, 1000)\n\n if (flow.get(\"switch_2_Totem_page\")) { // si ha sido habilitado cambiamos a la ventana principal de Totem en caso de haber quedado otra ventana abierta\n node.send([null, null, null, null, null, null, { \"payload\": { \"tab\": \"Totem\" } }, null]);\n }\n \n if ((flow.get(\"modo_totem\") == \"C\" || flow.get(\"modo_totem\") == \"D\" ) && !flow.get(\"supervisor\")){\n if(flow.get(\"botonsalida_activo\")){\n flow.set(\"botonsalida\", true)\n }\n }\n }\n if (flow.get(\"peso_estable_flag\")) {\n flow.set(\"peso\", flow.get(\"peso_estable\"));\n } \n\n \n //-------------------------------procesamiento de la lista de materiales-----------------------------------------------------\n //if (flow.get(\"lista_flag\") && flow.get(\"supervisor\")) {\n if (flow.get(\"lista_flag\")) {\n flow.set(\"lista_flag\", false) // evita otra entrada a esta secuencia para esta misma lista\n var lista = flow.get(\"lista_array\") // lista con todos los materiales y niveles juntos\n const lista_size = flow.get(\"lista_array\").length\n let j = 0; let k = 0; let i = 0; let maxlevel = 0;\n for (i = 0; i < lista_size; i++) { // calculamos el nivel maximo que tiene esta lista de menu\n if (parseInt(lista[i].nivel) > maxlevel) {\n maxlevel = parseInt(lista[i].nivel)\n }\n }\n flow.set(\"maxlevel\", maxlevel + 1) // guardamos el maximo nivel de menu identificado en la lista\n flow.set(\"selections\", \"\") //inicializamos con ninguna seleccion\n if (flow.get(\"menu_inicio\")) {\n flow.set(\"startmenu_flag\", true)\n }\n\n }\n\n //----------------------------------- FIN Lista de Materiales -----------------------------------------------------------------------\n}\n\nreturn ([null, null, null, null, msg, null, null, null]);\n", + "func": "let peso = flow.get(\"peso\") || 0;\nconst peso_minimo = flow.get(\"peso_minimo\");\nlet peso_estable = flow.get(\"peso_estable\");\nlet semaforo = flow.get(\"semaforo\");\n\nif (peso < peso_minimo) {\n // evento de bascula OFF para cuando el totem no dispone de sensor remoto\n /* eliminamos este trigger para el evento de la bascula\n if (peso < (peso_minimo * 0.8) && flow.get(\"peso_trigger_ON\")) {// consideramos una histeresis\n flow.set(\"peso_trigger_ON\", false) // marcamos que el trigger ON esta en FALSE para proxima activacion de la bascula\n node.send([null, null, null, { payload: 1, topic: \"peso_OFF\" }, null, null, null, null])\n }\n */\n //============================================ AQUI SE HACE EL REGISTRO DEL MOVIMIENTO EN BD ===============================\n if(!flow.get(\"peso_bajo_flag\")){ // Se cumple solo una vez al vaciar la bascula\n \n flow.set(\"matricula_image\", \"\") // inicializamos imagen del vehiculo\n flow.set(\"plate_sent\", false)\n flow.set(\"matricula_revisada\", false)\n flow.set(\"matricula_autorizada\", false)\n flow.set(\"last_firma\", \"\") // inicializamos imagen de la firma\n flow.set(\"identificacion_pendiente\", false) // estas cuatro lineas son relativas a la identificacion especial para cuando no se puede leer la matricula\n flow.set(\"identificacion_esp_aplicada\", false) // indica que la matricula no fue bien leida y se aplico el parametro de identificacion especial\n flow.set(\"QR_revisado\", false)\n flow.set(\"RFID_revisado\", false)\n flow.set(\"QR_verificado\", false)\n flow.set(\"RFID_verificado\", false)\n flow.set(\"peso_bajo_flag\", true)\n flow.set(\"matricula_leida_flag\", false)\n flow.set(\"matricula_formato_flag\", false)\n flow.set(\"snapshot_rq_flag\", false)\n flow.set(\"lista_array\", [])\n flow.set(\"menu0\", [])\n flow.set(\"menu1\", [])\n flow.set(\"menu2\", [])\n flow.set(\"menu_seleccionado_flag\", false)// indicador de que el usuario termino la seleccion en el menu y se envio\n flow.set(\"id_seleccionado\", \"no recibido\")\n flow.set(\"startmenu_flag\", false) // reset del flag que permite mostrar el boton (\"completar informacion\") de acceso al menu de materiales\n flow.set(\"editor_matricula_ok\", false) // se activa cuando el usuario hace clik en OK para ir a editar la matricula\n flow.set(\"badplate_llamado\", false) // se activa cuando se saca por primera vez la notificacion para EDITRA MATRICULA en la siguiente pantalla\n flow.set(\"nota_modifique_matricula_done\", false) // nota al usuario cuando hay que modificar matricula no registrada\n flow.set(\"nota_vuelva_intentar_done\", false) // nota al usuario despues de corregir la matricula en caso de error\n flow.set(\"nota_avise_basculista_done\", false) // nota al usuario de aviso al basculista\n flow.set(\"nota_resumen_mostrada\", false) // indica que la nota de resumen luego de presentar identificacion ya se mostro (nodo QR / RFID)\n flow.set(\"totem_master\", false) // flag para NO declarar peso estable si lo encontramos en false (ver nodo \"detector rx\") y para no enviar movimientos a Base de datos ni a servidor\n flow.set(\"matricula\", \"Sin Matricula\")\n flow.set(\"nombre_imagen\", \"sin-nombre-de-imagen\")\n flow.set(\"badplate\", false)\n flow.set(\"distance_flag_SET\", false)\n flow.set(\"semaforoabierto\", true) // flag para gestion del semaforo desde websocket\n //Atributos del vehiculo, leidos de la BD al momento de revisar si la matricula existe en BD\n flow.set(\"pma\", 0)\n flow.set(\"tara\", 0)\n flow.set(\"tipo_movimiento\", \"nodefinido\")\n flow.set(\"register\", {})\n flow.set(\"movimiento_enviado\", false)\n flow.set(\"matriculacheck_solicitada\", false) // flag utilizado para no repetir el envio de la revision de matricula en el nodo Matricula\n \n if (flow.get(\"switch_2_Totem_page\")) { //En caso que este flag haya sido habilitado en configuracion \n //eliminamos cualquier posible ventana de notificacion que haya quedado abierta y cambiamos a la ventana principal de Totem en caso de haber quedado otra ventana abierta\n \n node.send([null, null, null, null, null, { payload: \"\" }, { \"payload\": { \"tab\": \"Totem\" } }, null]);\n }\n else {\n //eliminamos cualquier posible ventana de notificacion que haya quedado abierta\n node.send([null, null, null, null, null, { payload: \"\" }, null, null]);\n }\n }\n //==========================================================================================================================\n flow.set(\"peso_estable_flag\", false)\n flow.set(\"peso_estable_audio_flag\", true)\n flow.set(\"peso_estable\", 0)\n flow.set(\"fin_pesada_flag\", false)\n //flow.set(\"totem_master\", false) // flag para NO declarar peso estable si lo encontramos en false (ver nodo \"detector rx\") y para no enviar movimientos a Base de datos ni a servidor\n if (flow.get(\"totem_qty\") == 1) { flow.set(\"totem_master\", true) } // en el caso de un solo totem. Este dispositivo siempre sera el master\n flow.set(\"firma_activa\", false)\n flow.set(\"QR_ok_flag\", false);\n flow.set(\"RFID_ok_flag\", false);\n flow.set(\"last_QR\", \"-\")\n flow.set(\"last_RFID\", \"-\")\n flow.set(\"botonsalida\", false)\n flow.set(\"vehiculo_en_posicion\", false)\n flow.set(\"salida_valida_flag\", false)\n \n flow.set(\"aviso_pma_hecho\", false) // reset del flag indicador de PMA\n //flow.set(\"matricula_leida_flag\", false)\n //flow.set(\"matricula_formato_flag\", false)\n flow.set(\"matricula_ok_flag\", false)\n flow.set(\"matricula_editada_flag\", false)\n //flow.set(\"matricula\", \"Sin Matricula\")\n //flow.set(\"snapshot_rq_flag\", false)\n //flow.set(\"nombre_imagen\", \"sin-nombre-de-imagen\")\n //flow.set(\"badplate\", false)\n flow.set(\"firma_ok_flag\", false)\n flow.set(\"movimiento_registrado_flag\", false)\n if (flow.get((\"semaforoabierto\"))){ // si el semaforo ha sido manipulado desde websocket entonces no lo tocamos\n flow.set(\"semaforo\", \"green\")\n }\n flow.set(\"window_men_m1\", \"\"); // borra posibles mensajes en pantalla \n flow.set(\"window_men_m2\", \"\"); \n flow.set(\"window_men_m3\", \"\");\n flow.set(\"window_id_m4\", \"\");\n flow.set(\"window_id_m2\", \"\");\n \n \n}\nelse {// ************************ peso > pmin *****************************************\n if (flow.get(\"peso_bajo_flag\")) {\n flow.set(\"peso_min_time\", new Date().getTime()) // marca momento en que se detecta peso > peso min\n //node.warn(\"peso_min_time = \" + flow.get(\"peso_min_time\"))\n flow.set(\"horaentrada\", new Date(flow.get(\"peso_min_time\")).toLocaleString()) // Convierte a formato legible\n // evento de bascula ON para cuando hay un solo Totem en la bascula (sin sensor remoto)\n /*\n if (flow.get(\"peso_trigger_ON\") == false) {\n flow.set(\"peso_trigger_ON\", true) // \n node.send([null, null, null, { payload: 1, topic: \"peso_ON\" }, null, null, null, null])\n }\n */\n node.send([null, null, null, { payload: 1, topic: \"peso_ON\" }, null, null, null, null]) // sacamos evento de bascula ON cuando no hay sensor remoto\n //flow.set(\"matricula_leida_flag\", false)\n //flow.set(\"matricula_formato_flag\", false)\n flow.set(\"matricula\", \"Sin Matricula\")\n flow.set(\"matricula_ok_flag\", false)\n flow.set(\"badplate\", false) // inicializamos flag en caso que haya sido enviado cuando peso < pmin \n flow.set(\"vehiculo_presente_flag\", true);\n flow.set(\"ID_enviado\", false) // activamos flag para envio de un unico RFID / QR con peso > pmin\n flow.set(\"esperando_id\", true)\n flow.set(\"peso_bajo_flag\", false);\n\n flow.set(\"semaforo\", \"red\")\n node.send([{ payload: 1 }, null, null, null, null, null, null, null]) // generamos un nuevo UUID\n setTimeout(function () {\n let new_register = {\n uuid: flow.get(\"new_uuid\"),\n horaentrada: flow.get(\"horaentrada\"),\n vial: flow.get(\"numero_vial\"),\n totem: flow.get(\"totem_id\"),\n sincro: false,\n modo: flow.get(\"modo_totem\"),\n firmaobligatoria: flow.get(\"firma_obligatoria\"),\n id_seleccionado: \"no recibido\",\n nombre_firma: \"No Habilitada\",\n QR: \"-\",\n RFID: \"-\",\n matricula: \"Sin Matricula\",\n nombre_imagen: \"Sin Matricula\",\n sentido: \"No conocido\"\n }\n flow.set(\"register\", new_register)\n }, 1000)\n\n if (flow.get(\"switch_2_Totem_page\")) { // si ha sido habilitado cambiamos a la ventana principal de Totem en caso de haber quedado otra ventana abierta\n node.send([null, null, null, null, null, null, { \"payload\": { \"tab\": \"Totem\" } }, null]);\n }\n \n if ((flow.get(\"modo_totem\") == \"C\" || flow.get(\"modo_totem\") == \"D\" ) && !flow.get(\"supervisor\")){\n if(flow.get(\"botonsalida_activo\")){\n flow.set(\"botonsalida\", true)\n }\n }\n }\n if (flow.get(\"peso_estable_flag\")) {\n flow.set(\"peso\", flow.get(\"peso_estable\"));\n } \n\n \n //-------------------------------procesamiento de la lista de materiales-----------------------------------------------------\n //if (flow.get(\"lista_flag\") && flow.get(\"supervisor\")) {\n if (flow.get(\"lista_flag\")) {\n flow.set(\"lista_flag\", false) // evita otra entrada a esta secuencia para esta misma lista\n var lista = flow.get(\"lista_array\") // lista con todos los materiales y niveles juntos\n const lista_size = flow.get(\"lista_array\").length\n let j = 0; let k = 0; let i = 0; let maxlevel = 0;\n for (i = 0; i < lista_size; i++) { // calculamos el nivel maximo que tiene esta lista de menu\n if (parseInt(lista[i].nivel) > maxlevel) {\n maxlevel = parseInt(lista[i].nivel)\n }\n }\n flow.set(\"maxlevel\", maxlevel + 1) // guardamos el maximo nivel de menu identificado en la lista\n flow.set(\"selections\", \"\") //inicializamos con ninguna seleccion\n if (flow.get(\"menu_inicio\")) {\n flow.set(\"startmenu_flag\", true)\n }\n\n }\n\n //----------------------------------- FIN Lista de Materiales -----------------------------------------------------------------------\n}\n\nreturn ([null, null, null, null, msg, null, null, null]);\n", "outputs": 7, "timeout": 0, "noerr": 0, @@ -4222,7 +4220,7 @@ "z": "953e8740401d175c", "g": "646bdfb9988a1708", "name": "Analisis del modo de Operacion", - "func": "//***************************** Selecciona Modo de Operacion **************************************************\nif (!flow.get(\"supervisor\")) {\n if (flow.get(\"peso_estable_flag\")) { //El peso estable se obtiene cuando el vehiculo esta frente al Totem (QR / RFID o sino Detector Local ON)\n\n if (flow.get(\"firma_obligatoria\") && !flow.get(\"firma_ok_flag\") && !flow.get(\"supervisor\") && (!flow.get(\"menu_activo\") || (flow.get(\"menu_activo\") && flow.get(\"menu_seleccionado_flag\")))) { //chequea si tenemos que solicitar firma\n /*El if anterior se cumple si:\n - firma_obligatoria es true y firma_ok_flag es false y si supervisor es false y ademas si menu_activo es false o bien menu_activo es true y menu_seleccionado_flag es true (osea se ha seleccionado el menu)\n Con esto aseguramos que la firma la sacamos una vez que el usuario ha hecho la seleccion del menu (en caso de existir) y no antes.\n */\n // hemos cambiado \"firma_habilitada\" por \"firma_obligatoria\" porque finalmente parece que con un solo parametro es suficiente\n flow.set(\"firma_flag\", true)\n setTimeout(() => {\n node.send([{ \"payload\": { \"tab\": \"Firma\" } }, { payload: \"firma\" }, null, null])\n }, 500);\n\n }\n\n //=============================================================================================================================================\n //====================================================== MODO DE OPERACION ====================================================================\n //=============================================================================================================================================\n let modo = flow.get(\"modo_totem\")\n // -----------------------------------------------------COMUN PARA TODOS LOS MODOS ------------------------------------------------------------\n //let QR_flag = flow.get(\"QR_ok_flag\") || false;\n //let RFID_flag = flow.get(\"RFID_ok_flag\") || false;\n let detector_flag = (flow.get(\"distance_flag_SET\") && (flow.get(\"sentido\") == \"entrada\") && flow.get(\"sensor_distancia_local\")) || false;\n let boton_flag = flow.get(\"salida_valida_flag\") || false;\n let matricula_flag = flow.get(\"matricula_ok_flag\") || false;\n let register_flag = flow.get(\"movimiento_registrado_flag\");\n let firma_flag = flow.get(\"firma_ok_flag\")\n let menu_activo = flow.get(\"menu_activo\") // el menu activo se configura en el archivo de configuracion\n let menu_selected = flow.get(\"menu_seleccionado_flag\") // este flag se activa cuando el conductor selecciona el residuo del menu y lo envia (en caso de menu_activo = true)\n let ID_verificado = flow.get(\"QR_verificado\") || flow.get(\"RFID_verificado\")\n \n // Reglas de obligatoriedad configurables en archivo de configuracion\n //let QR_obligatorio = flow.get(\"QR_obligatorio\") || false;\n //let RFID_obligatorio = flow.get(\"RFID_obligatorio\") || false;\n let ID_obligatorio = flow.get(\"ID_obligatorio\")\n let detector_obligatorio = flow.get(\"detector_obligatorio\") || false; // este es el detector de presencia de vehiculo frente al totem\n let boton_obligatorio = flow.get(\"boton_obligatorio\") || false; // Este corresponde al boton de la pantalla de Validacion en caso de estar habilitado\n let firma_obligatoria = flow.get(\"firma_obligatoria\") || false;\n //let matricula_obligatoria = flow.get(\"matricula_obligatoria\") || false\n let matricula_obligatoria = flow.get(\"matricula_obligatoria\") || true // siempre es obligatoria\n // Evaluación de cumplimiento de Flags actuales y Flags obligatorios\n //let QR_ok = !QR_obligatorio || QR_flag;\n //let RFID_ok = !RFID_obligatorio || RFID_flag;\n let ID_ok = !ID_obligatorio || ID_verificado\n let detector_ok = !detector_obligatorio || detector_flag;\n let boton_ok = !boton_obligatorio || boton_flag;\n let firma_ok = !firma_obligatoria || firma_flag;\n let matricula_ok = !matricula_obligatoria || matricula_flag\n let seleccion_ok\n if(flow.get(\"tipo_movimiento\") == \"inicial\"){\n seleccion_ok = !menu_activo || menu_selected || ID_verificado // Si el menu esta activo el ID_verificado permite saltar la seleccion del residuo\n }\n else if(flow.get(\"tipo_movimiento\") == \"final\"){\n //seleccion_ok = !menu_activo || menu_selected || ID_verificado || boton_flag\n seleccion_ok = true\n ID_ok = !flow.get(\"salida_ID_obligatorio\") || ID_verificado\n }\n /*\n if (flow.get(\"identificacion_esp\") && flow.get(\"identificacion_pendiente\")) {\n QR_ok = !QR_obligatorio && flow.get(\"QR_verificado\")\n RFID_ok = !RFID_obligatorio && flow.get(\"RFID_verificado\")\n }\n */\n let todos_obligatorios_ok;\n\n switch (modo) {\n\n case \"A\": //************************************** MODO A [ Matricula - QR / RFID - sensor local - boton de salida ]***************************************************** */\n // aqui revisamos si se recibio matricula y un evento que indique que el conductor esta frente al totem\n // puede ser alguno de los siguientes eslementos:\n // - un QR o una tarjeta RFID\n // - el boton de activacion de salida que ponemos en pantalla en caso de estar habilitado para ello en el archivo de configuración\n // - el sensor local de presencia de vehiculo\n // - la seleccion del menu\n // El flag movimiento_registrado_flag se revisa para asegurar que se registra una sola vez al cumplir las condiciones\n // El registro queda en memoria, este se pasa a BD solamente al momento que el vehiculo abandone la bascula es decir cuando peso < pmin\n // Adidionalmente se revisa si existe algun parametro OBLIGATORIO qye se deba recibir antes de dar por finalizada la pesada. \n // Un evento obligatorio podria ser La tarjeta RFID o el QR o pulsar el boton de Validacion\n\n todos_obligatorios_ok = ID_ok && detector_ok && boton_ok && seleccion_ok && !register_flag && firma_ok && matricula_ok;\n \n node.warn(\"todos obligatorios = \" + todos_obligatorios_ok)\n node.warn(\"ID_ok = \" + ID_ok + \" ; detector_ok = \" + detector_ok + \" ; register_flag = \" + register_flag + \" ; seleccion = \" + seleccion_ok + \" ; matricula = \" + matricula_ok + \" ; boton = \" + boton_ok )\n \n if (todos_obligatorios_ok) { // Cerramos el registro con los parametros hasta ahora recogidos\n //Agregamos al registro los nuevos datos recogidos\n //node.warn(\"matricula ok\")\n let new_register = flow.get(\"register\")\n new_register.matricula = flow.get(\"matricula\")\n new_register.matriculaeditada = flow.get(\"matricula_editada_flag\")\n new_register.nombre_imagen = flow.get(\"nombre_imagen\")\n /*\n if (flow.get(\"identificacion_esp_aplicada\")) {\n new_register.matricula = \"Sin Matricula\"\n new_register.nombre_imagen = \"Sin Matricula\"\n }\n */\n if (flow.get(\"tipo_movimiento\") == \"inicial\"){\n new_register.qr = flow.get(\"last_QR\")\n }\n else if (flow.get(\"tipo_movimiento\") == \"final\"){\n new_register.qrsalida = flow.get(\"last_QR\")\n }\n \n new_register.rfid = flow.get(\"last_RFID\")\n new_register.sentido = flow.get(\"sentido\")\n new_register.botonvalidacion = flow.get(\"salida_valida_flag\")\n if (flow.get(\"firma_obligatoria\") && flow.get(\"firma_ok_flag\")) {\n new_register.nombre_firma = flow.get(\"nombre_firma\")\n new_register.firmaobligatoria = true\n }\n else {\n new_register.nombre_firma = \"No Habilitada\"\n new_register.firmaobligatoria = false\n }\n if (flow.get(\"menu_activo\")){\n new_register.id_seleccionado = flow.get(\"id_seleccionado\")\n }\n if (!flow.get(\"movimiento_enviado\")){\n flow.set(\"register\", new_register)\n flow.set(\"movimiento_registrado_flag\", true)\n flow.set(\"fin_pesada_flag\", true)\n }\n }\n //------------------------------------------------------------------------------------------------------------------------------------------\n //node.warn(\"revisando QR / RFID flags\")\n //if (flow.get(\"QR_verificado\") || flow.get(\"RFID_verificado\") || flow.get(\"salida_valida_flag\") || flow.get(\"peso_estable_flag\")) {\n if (flow.get(\"QR_verificado\") || flow.get(\"RFID_verificado\")) {\n flow.set(\"window_men_m3\", \"\");\n }\n else {\n //node.warn(\"sacamos mensaje de identificacion\")\n flow.set(\"window_men_m3\", flow.get(\"men_identificacion\"));\n }//-----------------------------------------------------------------------------------------------------------------------------------------\n break;\n\n case \"B\": //************************************** MODO B [ Matricula - sensor local - boton de salida ] *****************************************************\n // aqui revisamos si se recibio matricula y un evento que indique que el conductor esta frente al totem\n // puede ser alguno de los siguientes eslementos:\n // - el boton de activacion de salida que ponemos en pantalla en caso de estar habilitado para ello en el archivo de configuración\n // - el sensor local de presencia de vehiculo\n // El flag movimiento_registrado_flag se revisa para asegurar que se registra una sola vez al cumplir las condiciones\n // El registro queda en memoria, este se pasa a BD solamente al momento que el vehiculo abandone la bascula es decir cuando peso < pmin\n // Adidionalmente se revisa si existe algun parametro OBLIGATORIO qye se deba recibir antes de dar por finalizada la pesada. \n // Un evento obligatorio podria ser La tarjeta RFID o el QR o pulsar el boton de Validacion\n\n todos_obligatorios_ok = detector_ok && boton_ok && seleccion_ok && !register_flag && firma_ok && matricula_ok;\n if (todos_obligatorios_ok) { // Cerramos el registro con los parametros hasta ahora recogidos\n //Agregamos al registro los nuevos datos recogidos\n let new_register = flow.get(\"register\")\n new_register.matricula = flow.get(\"matricula\")\n new_register.matriculaeditada = flow.get(\"matricula_editada_flag\")\n new_register.nombre_imagen = flow.get(\"nombre_imagen\")\n new_register.qr = \"Sin Lector de QR\"\n new_register.rfid = \"Sin Lector de RFID\"\n new_register.sentido = flow.get(\"sentido\")\n new_register.botonvalidacion = flow.get(\"salida_valida_flag\")\n if (flow.get(\"firma_obligatoria\") && flow.get(\"firma_ok_flag\")) {\n new_register.nombre_firma = \"firma-\" + flow.get(\"nombre_imagen\")\n new_register.firmaobligatoria = true\n }\n else {\n new_register.nombre_firma = \"No Habilitada\"\n new_register.firmaobligatoria = false\n }\n if (flow.get(\"menu_activo\")) {\n new_register.id_seleccionado = flow.get(\"id_seleccionado\")\n }\n flow.set(\"register\", new_register)\n flow.set(\"movimiento_registrado_flag\", true)\n flow.set(\"fin_pesada_flag\", true)\n }\n break;\n case \"C\": //************************************** MODO C [ QR / RFID - sensor local - boton de salida ]*****************************************************\n // aqui revisamos si se recibio un evento que indique que el conductor esta frente al totem\n // puede ser alguno de los siguientes eslementos:\n // - un QR o una tarjeta RFID\n // - el boton de activacion de salida que ponemos en pantalla en caso de estar habilitado para ello en el archivo de configuración\n // - el sensor local de presencia de vehiculo\n // El flag movimiento_registrado_flag se revisa para asegurar que se registra una sola vez al cumplir las condiciones\n // El registro queda en memoria, este se pasa a BD solamente al momento que el vehiculo abandone la bascula es decir cuando peso < pmin por primera vez\n // Adidionalmente se revisa si existe algun parametro OBLIGATORIO que se deba recibir antes de dar por finalizada la pesada. \n // Un evento obligatorio podria ser La tarjeta RFID o el QR o pulsar el boton de Validacion\n\n todos_obligatorios_ok = ID_ok && detector_ok && boton_ok && seleccion_ok && !register_flag && firma_ok;\n if (todos_obligatorios_ok) { // Cerramos el registro con los parametros hasta ahora recogidos\n\n //Agregamos al registro los nuevos datos recogidos\n let new_register = flow.get(\"register\")\n new_register.matricula = \"Sin Camara\"\n new_register.matriculaeditada = false\n new_register.nombre_imagen = \"Sin Camara\"\n new_register.qr = flow.get(\"last_QR\")\n new_register.rfid = flow.get(\"last_RFID\")\n new_register.sentido = flow.get(\"sentido\")\n new_register.botonvalidacion = flow.get(\"salida_valida_flag\")\n if (flow.get(\"firma_obligatoria\") && flow.get(\"firma_ok_flag\")) {\n new_register.nombre_firma = \"firma-\" + flow.get(\"nombre_imagen\")\n new_register.firmaobligatoria = true\n }\n else {\n new_register.nombre_firma = \"No Habilitada\"\n new_register.firmaobligatoria = false\n }\n if (flow.get(\"menu_activo\")) {\n new_register.id_seleccionado = flow.get(\"id_seleccionado\")\n }\n flow.set(\"register\", new_register)\n flow.set(\"movimiento_registrado_flag\", true)\n flow.set(\"fin_pesada_flag\", true)\n }\n //------------------------------------------------------------------------------------------------------------------------------------------\n if (flow.get(\"QR_ok_flag\") || flow.get(\"RFID_ok_flag\")) {\n flow.set(\"window_men_m3\", \"\");\n }\n else {\n flow.set(\"window_men_m3\", flow.get(\"men_identificacion\"));\n }//-----------------------------------------------------------------------------------------------------------------------------------------\n\n break;\n case \"D\": //************************************** MODO D [boton de salida ]*****************************************************\n // aqui revisamos si se recibio el boton de validacion que indica que el conductor esta frente al totem\n // El flag movimiento_registrado_flag se revisa para asegurar que se registra una sola vez al cumplir las condiciones\n // El registro queda en memoria, este se pasa a BD solamente al momento que el vehiculo abandone la bascula es decir cuando peso < pmin\n boton_flag = flow.get(\"salida_valida_flag\") || false;\n\n boton_obligatorio = seleccion_ok && (flow.get(\"boton_obligatorio\") || false); // Este corresponde al boton de la pantalla de Validacion en caso de estar habilitado\n register_flag = flow.get(\"movimiento_registrado_flag\")\n\n // Evaluación de cumplimiento de Flags actuales y Flags obligatorios\n\n boton_ok = !boton_obligatorio || boton_flag;\n\n todos_obligatorios_ok = boton_ok && !register_flag && firma_ok;\n if (todos_obligatorios_ok) { // Cerramos el registro con los parametros hasta ahora recogidos\n\n //Agregamos al registro los nuevos datos recogidos\n let new_register = flow.get(\"register\")\n new_register.matricula = \"Sin Camara\"\n new_register.matriculaeditada = false\n new_register.nombre_imagen = \"Sin Camara\"\n new_register.qr = \"Sin Lector de QR\"\n new_register.rfid = \"Sin Lector de RFID\"\n new_register.sentido = flow.get(\"sentido\")\n new_register.botonvalidacion = flow.get(\"salida_valida_flag\")\n if (flow.get(\"firma_obligatoria\") && flow.get(\"firma_ok_flag\")) {\n new_register.nombre_firma = \"firma-\" + flow.get(\"nombre_imagen\")\n new_register.firmaobligatoria = true\n }\n else {\n new_register.nombre_firma = \"No Habilitada\"\n new_register.firmaobligatoria = false\n }\n if (flow.get(\"menu_activo\")) {\n new_register.id_seleccionado = flow.get(\"id_seleccionado\")\n }\n flow.set(\"register\", new_register)\n flow.set(\"movimiento_registrado_flag\", true)\n flow.set(\"fin_pesada_flag\", true)\n }\n\n break;\n\n }// termina el codigo del SWITCH CASE\n //*************************************************** PREPARACION Y ENVIO DEL MOVIMIENTO *******************************************************\n if (flow.get(\"movimiento_registrado_flag\") && !flow.get(\"supervisor\") && flow.get(\"totem_master\") && (flow.get(\"tipo_movimiento\") != \"nodefinido\")&& !flow.get(\"movimiento_enviado\")) {\n let date = new Date();\n let timestamp = parseInt(date.getTime() / 1000);\n flow.set(\"horasalida\", new Date(date.getTime()).toLocaleString()) // Convierte a formato legible\n\n let new_register = flow.get(\"register\")\n new_register.horasalida = flow.get(\"horasalida\")\n new_register.pesoestable = flow.get(\"peso_estable\")\n new_register.timestamp = timestamp\n //hay que revisar imagen, QR y RFID ya que no en todos los casos estan presentes\n\n let obj = new_register;\n delete obj.sincro\n new_register = obj\n new_register.imagen = flow.get(\"matricula_image\")\n if (flow.get(\"firma_obligatoria\")) { // cambiamos \"firma_habilitada\" por \"firma_obligatoria\"\n new_register.firma = flow.get(\"last_firma\")\n }\n\n //let msg_plate = { payload: flow.get(\"matricula_image\"), filename: flow.get(\"path_images\") + flow.get(\"nombre_imagen\") } // guardamos archivo con imagen en disco local\n\n //flow.set(\"register2API\", new_register) // guardamos el objeto json completo con imagen de matricula e imagen de firma \n\n flow.set(\"movimiento_registrado_flag\", false) // evitamos que podamos entrar en este espacio hasta nuevo registro\n\n // *********************** preparamos json con movimiento para enviar al supervisor local de la bascula *****************\n let msg_mov = { payload: {} }\n new_register.tara = flow.get(\"tara\")\n new_register.destareautomatico = flow.get(\"destareautomatico\")\n msg_mov.payload.device = \"supervisor\"\n msg_mov.payload.totem_id = flow.get(\"totem_id\")\n msg_mov.payload.accion = \"movimiento\"\n //msg_mov.payload.tipo = flow.get(\"modelo\") // entrada / salida\n msg_mov.payload.tipomovimiento = flow.get(\"tipo_movimiento\")\n //msg_mov.payload.urlapi = flow.get(\"url_API\")\n msg_mov.payload.movimiento = new_register // enviamos el registro del movimiento con las imagenes de matricula y de firma\n flow.set(\"movimiento_enviado\", true)\n flow.set(\"new_register\", {}) // inicializamos el registro para evitar cualquier posible duplicado en bd\n node.send([null, null, msg_mov, null])\n }\n\n }\n}\nreturn ([null, null, null, msg])", + "func": "//***************************** Selecciona Modo de Operacion **************************************************\nif (!flow.get(\"supervisor\")) {\n if (flow.get(\"peso_estable_flag\")) { //El peso estable se obtiene cuando el vehiculo esta frente al Totem (QR / RFID o sino Detector Local ON)\n\n if (flow.get(\"firma_obligatoria\") && !flow.get(\"firma_ok_flag\") && !flow.get(\"supervisor\") && (!flow.get(\"menu_activo\") || (flow.get(\"menu_activo\") && flow.get(\"menu_seleccionado_flag\")))) { //chequea si tenemos que solicitar firma\n /*El if anterior se cumple si:\n - firma_obligatoria es true y firma_ok_flag es false y si supervisor es false y ademas si menu_activo es false o bien menu_activo es true y menu_seleccionado_flag es true (osea se ha seleccionado el menu)\n Con esto aseguramos que la firma la sacamos una vez que el usuario ha hecho la seleccion del menu (en caso de existir) y no antes.\n */\n // hemos cambiado \"firma_habilitada\" por \"firma_obligatoria\" porque finalmente parece que con un solo parametro es suficiente\n flow.set(\"firma_flag\", true)\n setTimeout(() => {\n node.send([{ \"payload\": { \"tab\": \"Firma\" } }, { payload: \"firma\" }, null, null])\n }, 500);\n\n }\n\n //=============================================================================================================================================\n //====================================================== MODO DE OPERACION ====================================================================\n //=============================================================================================================================================\n let modo = flow.get(\"modo_totem\")\n // -----------------------------------------------------COMUN PARA TODOS LOS MODOS ------------------------------------------------------------\n //let QR_flag = flow.get(\"QR_ok_flag\") || false;\n //let RFID_flag = flow.get(\"RFID_ok_flag\") || false;\n let detector_flag = (flow.get(\"distance_flag_SET\") && (flow.get(\"sentido\") == \"entrada\") && flow.get(\"sensor_distancia_local\")) || false;\n let boton_flag = flow.get(\"salida_valida_flag\") || false;\n let matricula_flag = flow.get(\"matricula_ok_flag\") || false;\n let register_flag = flow.get(\"movimiento_registrado_flag\");\n let firma_flag = flow.get(\"firma_ok_flag\")\n let menu_activo = flow.get(\"menu_activo\") // el menu activo se configura en el archivo de configuracion\n let menu_selected = flow.get(\"menu_seleccionado_flag\") // este flag se activa cuando el conductor selecciona el residuo del menu y lo envia (en caso de menu_activo = true)\n let ID_verificado = flow.get(\"QR_verificado\") || flow.get(\"RFID_verificado\")\n \n // Reglas de obligatoriedad configurables en archivo de configuracion\n //let QR_obligatorio = flow.get(\"QR_obligatorio\") || false;\n //let RFID_obligatorio = flow.get(\"RFID_obligatorio\") || false;\n let ID_obligatorio = flow.get(\"ID_obligatorio\")\n let detector_obligatorio = flow.get(\"detector_obligatorio\") || false; // este es el detector de presencia de vehiculo frente al totem\n let boton_obligatorio = flow.get(\"boton_obligatorio\") || false; // Este corresponde al boton de la pantalla de Validacion en caso de estar habilitado\n let firma_obligatoria = flow.get(\"firma_obligatoria\") || false;\n //let matricula_obligatoria = flow.get(\"matricula_obligatoria\") || false\n let matricula_obligatoria = flow.get(\"matricula_obligatoria\") || true // siempre es obligatoria\n // Evaluación de cumplimiento de Flags actuales y Flags obligatorios\n //let QR_ok = !QR_obligatorio || QR_flag;\n //let RFID_ok = !RFID_obligatorio || RFID_flag;\n let ID_ok = !ID_obligatorio || ID_verificado\n let detector_ok = !detector_obligatorio || detector_flag;\n if (flow.get(\"tipo_movimiento\") == \"inicial\") { boton_flag = true } // en movimiento inicial no tiene sentido el boton\n let boton_ok = !boton_obligatorio || boton_flag;\n let firma_ok = !firma_obligatoria || firma_flag;\n //**************************************************** Excepcion para Trajeta RFID **************************************************\n //****************************************************No es necesario tener la matricula del Vehiculo *******************************\n if(flow.get(\"RFID_verificado\")) {matricula_flag = true}\n \n let matricula_ok = !matricula_obligatoria || matricula_flag\n let seleccion_ok\n if(flow.get(\"tipo_movimiento\") == \"inicial\"){\n seleccion_ok = !menu_activo || menu_selected || ID_verificado // Si el menu esta activo el ID_verificado permite saltar la seleccion del residuo\n }\n else if(flow.get(\"tipo_movimiento\") == \"final\"){\n //seleccion_ok = !menu_activo || menu_selected || ID_verificado || boton_flag\n seleccion_ok = true\n ID_ok = !flow.get(\"salida_ID_obligatorio\") || ID_verificado\n }\n /*\n if (flow.get(\"identificacion_esp\") && flow.get(\"identificacion_pendiente\")) {\n QR_ok = !QR_obligatorio && flow.get(\"QR_verificado\")\n RFID_ok = !RFID_obligatorio && flow.get(\"RFID_verificado\")\n }\n */\n let todos_obligatorios_ok;\n\n switch (modo) {\n\n case \"A\": //************************************** MODO A [ Matricula - QR / RFID - sensor local - boton de salida ]***************************************************** */\n // aqui revisamos si se recibio matricula y un evento que indique que el conductor esta frente al totem\n // puede ser alguno de los siguientes eslementos:\n // - un QR o una tarjeta RFID\n // - el boton de activacion de salida que ponemos en pantalla en caso de estar habilitado para ello en el archivo de configuración\n // - el sensor local de presencia de vehiculo\n // - la seleccion del menu\n // El flag movimiento_registrado_flag se revisa para asegurar que se registra una sola vez al cumplir las condiciones\n // El registro queda en memoria, este se pasa a BD solamente al momento que el vehiculo abandone la bascula es decir cuando peso < pmin\n // Adidionalmente se revisa si existe algun parametro OBLIGATORIO qye se deba recibir antes de dar por finalizada la pesada. \n // Un evento obligatorio podria ser La tarjeta RFID o el QR o pulsar el boton de Validacion\n\n todos_obligatorios_ok = ID_ok && detector_ok && boton_ok && seleccion_ok && !register_flag && firma_ok && matricula_ok;\n \n node.warn(\"todos obligatorios = \" + todos_obligatorios_ok)\n node.warn(\"ID_ok = \" + ID_ok + \" ; detector_ok = \" + detector_ok + \" ; register_flag = \" + register_flag + \" ; seleccion = \" + seleccion_ok + \" ; matricula = \" + matricula_ok + \" ; boton = \" + boton_ok )\n \n if (todos_obligatorios_ok) { // Cerramos el registro con los parametros hasta ahora recogidos\n //Agregamos al registro los nuevos datos recogidos\n //node.warn(\"matricula ok\")\n let new_register = flow.get(\"register\")\n new_register.matricula = flow.get(\"matricula\")\n new_register.matriculaeditada = flow.get(\"matricula_editada_flag\")\n new_register.nombre_imagen = flow.get(\"nombre_imagen\")\n /*\n if (flow.get(\"identificacion_esp_aplicada\")) {\n new_register.matricula = \"Sin Matricula\"\n new_register.nombre_imagen = \"Sin Matricula\"\n }\n */\n if (flow.get(\"tipo_movimiento\") == \"inicial\"){\n new_register.qr = flow.get(\"last_QR\")\n }\n else if (flow.get(\"tipo_movimiento\") == \"final\"){\n new_register.qrsalida = flow.get(\"last_QR\")\n }\n \n new_register.rfid = flow.get(\"last_RFID\")\n new_register.sentido = flow.get(\"sentido\")\n new_register.botonvalidacion = flow.get(\"salida_valida_flag\")\n if (flow.get(\"firma_obligatoria\") && flow.get(\"firma_ok_flag\")) {\n new_register.nombre_firma = flow.get(\"nombre_firma\")\n new_register.firmaobligatoria = true\n }\n else {\n new_register.nombre_firma = \"No Habilitada\"\n new_register.firmaobligatoria = false\n }\n if (flow.get(\"menu_activo\")){\n new_register.id_seleccionado = flow.get(\"id_seleccionado\")\n }\n if (!flow.get(\"movimiento_enviado\")){\n flow.set(\"register\", new_register)\n flow.set(\"movimiento_registrado_flag\", true)\n flow.set(\"fin_pesada_flag\", true)\n }\n }\n //------------------------------------------------------------------------------------------------------------------------------------------\n //node.warn(\"revisando QR / RFID flags\")\n //if (flow.get(\"QR_verificado\") || flow.get(\"RFID_verificado\") || flow.get(\"salida_valida_flag\") || flow.get(\"peso_estable_flag\")) {\n if (flow.get(\"QR_verificado\") || flow.get(\"RFID_verificado\")) {\n flow.set(\"window_men_m3\", \"\");\n }\n else {\n //node.warn(\"sacamos mensaje de identificacion\")\n flow.set(\"window_men_m3\", flow.get(\"men_identificacion\"));\n }//-----------------------------------------------------------------------------------------------------------------------------------------\n break;\n\n case \"B\": //************************************** MODO B [ Matricula - sensor local - boton de salida ] *****************************************************\n // aqui revisamos si se recibio matricula y un evento que indique que el conductor esta frente al totem\n // puede ser alguno de los siguientes eslementos:\n // - el boton de activacion de salida que ponemos en pantalla en caso de estar habilitado para ello en el archivo de configuración\n // - el sensor local de presencia de vehiculo\n // El flag movimiento_registrado_flag se revisa para asegurar que se registra una sola vez al cumplir las condiciones\n // El registro queda en memoria, este se pasa a BD solamente al momento que el vehiculo abandone la bascula es decir cuando peso < pmin\n // Adidionalmente se revisa si existe algun parametro OBLIGATORIO qye se deba recibir antes de dar por finalizada la pesada. \n // Un evento obligatorio podria ser La tarjeta RFID o el QR o pulsar el boton de Validacion\n\n todos_obligatorios_ok = detector_ok && boton_ok && seleccion_ok && !register_flag && firma_ok && matricula_ok;\n if (todos_obligatorios_ok) { // Cerramos el registro con los parametros hasta ahora recogidos\n //Agregamos al registro los nuevos datos recogidos\n let new_register = flow.get(\"register\")\n new_register.matricula = flow.get(\"matricula\")\n new_register.matriculaeditada = flow.get(\"matricula_editada_flag\")\n new_register.nombre_imagen = flow.get(\"nombre_imagen\")\n new_register.qr = \"Sin Lector de QR\"\n new_register.rfid = \"Sin Lector de RFID\"\n new_register.sentido = flow.get(\"sentido\")\n new_register.botonvalidacion = flow.get(\"salida_valida_flag\")\n if (flow.get(\"firma_obligatoria\") && flow.get(\"firma_ok_flag\")) {\n new_register.nombre_firma = \"firma-\" + flow.get(\"nombre_imagen\")\n new_register.firmaobligatoria = true\n }\n else {\n new_register.nombre_firma = \"No Habilitada\"\n new_register.firmaobligatoria = false\n }\n if (flow.get(\"menu_activo\")) {\n new_register.id_seleccionado = flow.get(\"id_seleccionado\")\n }\n flow.set(\"register\", new_register)\n flow.set(\"movimiento_registrado_flag\", true)\n flow.set(\"fin_pesada_flag\", true)\n }\n break;\n case \"C\": //************************************** MODO C [ QR / RFID - sensor local - boton de salida ]*****************************************************\n // aqui revisamos si se recibio un evento que indique que el conductor esta frente al totem\n // puede ser alguno de los siguientes eslementos:\n // - un QR o una tarjeta RFID\n // - el boton de activacion de salida que ponemos en pantalla en caso de estar habilitado para ello en el archivo de configuración\n // - el sensor local de presencia de vehiculo\n // El flag movimiento_registrado_flag se revisa para asegurar que se registra una sola vez al cumplir las condiciones\n // El registro queda en memoria, este se pasa a BD solamente al momento que el vehiculo abandone la bascula es decir cuando peso < pmin por primera vez\n // Adidionalmente se revisa si existe algun parametro OBLIGATORIO que se deba recibir antes de dar por finalizada la pesada. \n // Un evento obligatorio podria ser La tarjeta RFID o el QR o pulsar el boton de Validacion\n\n todos_obligatorios_ok = ID_ok && detector_ok && boton_ok && seleccion_ok && !register_flag && firma_ok;\n if (todos_obligatorios_ok) { // Cerramos el registro con los parametros hasta ahora recogidos\n\n //Agregamos al registro los nuevos datos recogidos\n let new_register = flow.get(\"register\")\n new_register.matricula = \"Sin Camara\"\n new_register.matriculaeditada = false\n new_register.nombre_imagen = \"Sin Camara\"\n new_register.qr = flow.get(\"last_QR\")\n new_register.rfid = flow.get(\"last_RFID\")\n new_register.sentido = flow.get(\"sentido\")\n new_register.botonvalidacion = flow.get(\"salida_valida_flag\")\n if (flow.get(\"firma_obligatoria\") && flow.get(\"firma_ok_flag\")) {\n new_register.nombre_firma = \"firma-\" + flow.get(\"nombre_imagen\")\n new_register.firmaobligatoria = true\n }\n else {\n new_register.nombre_firma = \"No Habilitada\"\n new_register.firmaobligatoria = false\n }\n if (flow.get(\"menu_activo\")) {\n new_register.id_seleccionado = flow.get(\"id_seleccionado\")\n }\n flow.set(\"register\", new_register)\n flow.set(\"movimiento_registrado_flag\", true)\n flow.set(\"fin_pesada_flag\", true)\n }\n //------------------------------------------------------------------------------------------------------------------------------------------\n if (flow.get(\"QR_ok_flag\") || flow.get(\"RFID_ok_flag\")) {\n flow.set(\"window_men_m3\", \"\");\n }\n else {\n flow.set(\"window_men_m3\", flow.get(\"men_identificacion\"));\n }//-----------------------------------------------------------------------------------------------------------------------------------------\n\n break;\n case \"D\": //************************************** MODO D [boton de salida ]*****************************************************\n // aqui revisamos si se recibio el boton de validacion que indica que el conductor esta frente al totem\n // El flag movimiento_registrado_flag se revisa para asegurar que se registra una sola vez al cumplir las condiciones\n // El registro queda en memoria, este se pasa a BD solamente al momento que el vehiculo abandone la bascula es decir cuando peso < pmin\n boton_flag = flow.get(\"salida_valida_flag\") || false;\n\n boton_obligatorio = seleccion_ok && (flow.get(\"boton_obligatorio\") || false); // Este corresponde al boton de la pantalla de Validacion en caso de estar habilitado\n register_flag = flow.get(\"movimiento_registrado_flag\")\n\n // Evaluación de cumplimiento de Flags actuales y Flags obligatorios\n\n boton_ok = !boton_obligatorio || boton_flag;\n\n todos_obligatorios_ok = boton_ok && !register_flag && firma_ok;\n if (todos_obligatorios_ok) { // Cerramos el registro con los parametros hasta ahora recogidos\n\n //Agregamos al registro los nuevos datos recogidos\n let new_register = flow.get(\"register\")\n new_register.matricula = \"Sin Camara\"\n new_register.matriculaeditada = false\n new_register.nombre_imagen = \"Sin Camara\"\n new_register.qr = \"Sin Lector de QR\"\n new_register.rfid = \"Sin Lector de RFID\"\n new_register.sentido = flow.get(\"sentido\")\n new_register.botonvalidacion = flow.get(\"salida_valida_flag\")\n if (flow.get(\"firma_obligatoria\") && flow.get(\"firma_ok_flag\")) {\n new_register.nombre_firma = \"firma-\" + flow.get(\"nombre_imagen\")\n new_register.firmaobligatoria = true\n }\n else {\n new_register.nombre_firma = \"No Habilitada\"\n new_register.firmaobligatoria = false\n }\n if (flow.get(\"menu_activo\")) {\n new_register.id_seleccionado = flow.get(\"id_seleccionado\")\n }\n flow.set(\"register\", new_register)\n flow.set(\"movimiento_registrado_flag\", true)\n flow.set(\"fin_pesada_flag\", true)\n }\n\n break;\n\n }// termina el codigo del SWITCH CASE\n //*************************************************** PREPARACION Y ENVIO DEL MOVIMIENTO *******************************************************\n if (flow.get(\"movimiento_registrado_flag\") && !flow.get(\"supervisor\") && flow.get(\"totem_master\") && (flow.get(\"tipo_movimiento\") != \"nodefinido\")&& !flow.get(\"movimiento_enviado\")) {\n let date = new Date();\n let timestamp = parseInt(date.getTime() / 1000);\n flow.set(\"horasalida\", new Date(date.getTime()).toLocaleString()) // Convierte a formato legible\n\n let new_register = flow.get(\"register\")\n new_register.horasalida = flow.get(\"horasalida\")\n new_register.pesoestable = flow.get(\"peso_estable\")\n new_register.timestamp = timestamp\n //hay que revisar imagen, QR y RFID ya que no en todos los casos estan presentes\n\n let obj = new_register;\n delete obj.sincro\n new_register = obj\n new_register.imagen = flow.get(\"matricula_image\")\n if (flow.get(\"firma_obligatoria\")) { // cambiamos \"firma_habilitada\" por \"firma_obligatoria\"\n new_register.firma = flow.get(\"last_firma\")\n }\n\n //let msg_plate = { payload: flow.get(\"matricula_image\"), filename: flow.get(\"path_images\") + flow.get(\"nombre_imagen\") } // guardamos archivo con imagen en disco local\n\n //flow.set(\"register2API\", new_register) // guardamos el objeto json completo con imagen de matricula e imagen de firma \n\n flow.set(\"movimiento_registrado_flag\", false) // evitamos que podamos entrar en este espacio hasta nuevo registro\n\n // *********************** preparamos json con movimiento para enviar al supervisor local de la bascula *****************\n let msg_mov = { payload: {} }\n new_register.tara = flow.get(\"tara\")\n new_register.destareautomatico = flow.get(\"destareautomatico\")\n msg_mov.payload.device = \"supervisor\"\n msg_mov.payload.totem_id = flow.get(\"totem_id\")\n msg_mov.payload.accion = \"movimiento\"\n //msg_mov.payload.tipo = flow.get(\"modelo\") // entrada / salida\n msg_mov.payload.tipomovimiento = flow.get(\"tipo_movimiento\")\n //msg_mov.payload.urlapi = flow.get(\"url_API\")\n msg_mov.payload.movimiento = new_register // enviamos el registro del movimiento con las imagenes de matricula y de firma\n flow.set(\"movimiento_enviado\", true)\n flow.set(\"new_register\", {}) // inicializamos el registro para evitar cualquier posible duplicado en bd\n node.send([null, null, msg_mov, null])\n }\n\n }\n}\nreturn ([null, null, null, msg])", "outputs": 4, "timeout": 0, "noerr": 0, @@ -4465,27 +4463,6 @@ ] ] }, - { - "id": "689afd7656952062", - "type": "function", - "z": "953e8740401d175c", - "g": "9328043d4e9512a9", - "name": "matricula", - "func": "// DEFINICION DE ALGUNOS FLAGS UTILIZADOS EN EL NODO\n//matricula_leida_flag: Si es igual a true, indica que hemos recibido matrícula de la camara.La matrícula puede ser valida o no.Sólo indica recepción de objeto de camara\n//peso_bajo_flag: Si es igual a true, indica que el ESTADO del peso esta por debajo del peso minimo.\n//Sirve para tomar unas acciones una sola vez cuándo se detecta peso > pmin(el flag esta en true en ese momento) y luego el flag pasa a false es decir el ESTADO ahora es peso por encima del minimo.\n//matricula_revisada: Si true, indica que la matrícula ha sido revisada en la Base de Datos\n//matricula_autorizada: Si true, indica que la matrícula ha sido encontrada en la base de datos y esta autorizada es decir dispone de un contrato por lo tanto el usuario va a recibir un menu en pantalla.\n//matricula_ok_flag : Si igual a true indica que el proceso de lectura de matrícula (camara o edicion en pantalla) ha sido completado satisfactoriamente y el sistema puede seguir adelante.\n//matricula_formato_flag: Si es igual a true indica que la matrícula recibida de la camara tiene el formato adecuado o que el conductor ha introducido en la pantalla una matrícula correcta en formato.\n//edicion_matricula: Si true, indica que el usuario puede utilizar el editor de matrícula en caso de error de lectura, para colocar la matrícula correcta.\n//editor_matricula_ok: Si true, indica que el usuario ha aceptado abrir el editor de matrículas.\n\n\n//====================================== Chequea validez de Matricula ========================================\nlet repetir_matricula = false // variable para gestionar repeticion de la edicion de matricula en caso de error en la introduccion\nif (flow.get(\"matricula_leida_flag\") && !flow.get(\"supervisor\") && flow.get(\"totem_master\") && !flow.get(\"peso_bajo_flag\")) { // Primero verifica si se ha leido y si esta aun en proceso\n if (flow.get(\"matricula_formato_flag\")) {// Verifica si la matricula recibida o editada esta en formato\n flow.set(\"matricula_ok_flag\", true) // matricula conforme en formato para seguir adelante con el proceso\n \n if(flow.get(\"menu_activo\")){// chequea si el totem debe estar pendiente de las matriculas y los contratos\n //================================================== MENU ACTIVO ================================================================================\n if (flow.get(\"matricula_revisada\")){//chequea si ya se ha revisado la existencia de la matricula en BD\n if (flow.get(\"matricula_autorizada\")){// Revisa si la matricula esta autorizada en BD\n flow.set(\"matricula_leida_flag\", false) // proceso de matricula ya finalizado, evita entrar aqui otra vez\n if (flow.get(\"tipo_movimiento\") == \"final\" && flow.get(\"botonsalida\") == false) {\n //node.warn(\"activado boton de salida\")\n flow.set(\"botonsalida\", true)\n }\n }\n else{\n \n // SIN edicion de matricula y SIN identificacion especial\n if (!flow.get(\"edicion_matricula\") && !flow.get(\"identificacion_esp\") && !flow.get(\"nota_avise_basculista_done\")){ \n node.send([null, { payload: \"

MATRICULA NO REGISTRADA

AVISE AL BASCULISTA

\" }, null])\n flow.set(\"nota_avise_basculista_done\", true)\n }\n\n // Matricula editada anteriormente\n else if (flow.get(\"editor_matricula_ok\") && !flow.get(\"nota_vuelva_intentar_done\")) {\n node.send([null, { payload: \"

MATRICULA NO REGISTRADA

VUELVA A INTENTARLO

\" }, null])\n flow.set(\"nota_vuelva_intentar_done\", true)\n flow.set(\"badplate\", true) // para poder volver a sacar anuncio de matricula mala y editor de matricula\n flow.set(\"badplate_llamado\", false)\n repetir_matricula = true // para poder hacer un delay antes de sacar anuncio de editor\n }\n\n // Edicion de Matricula\n else if (flow.get(\"edicion_matricula\") && !flow.get(\"nota_modifique_matricula_done\")){\n node.send([null, { payload: \"

MATRICULA NO REGISTRADA

MODIFIQUE MATRICULA

\" }, null])\n flow.set(\"nota_modifique_matricula_done\", true)\n flow.set(\"nota_vuelva_intentar_done\", true)\n flow.set(\"badplate\", true) // para poder volver a sacar anuncio de matricula mala y editor de matricula\n repetir_matricula = true // para poder hacer un delay antes de sacar anuncio de editor\n }\n /*\n //CON identificacion especial\n else if (flow.get(\"identificacion_esp\")) {\n flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"identificacion_esp_aplicada\", true)\n flow.set(\"matricula_ok_flag\", true) // marcamos como matricula conforme para seguir adelante con el proceso\n flow.set(\"identificacion_pendiente\", true) // pendiente de presentar identificacion\n if (flow.get(\"botonsalida_activo\")) {\n flow.set(\"botonsalida\", true)\n }\n node.send([null, { payload: \"

MATRICULA ERRONEA

DEBE PRESENTAR UN QR O TARJETA VALIDA

\" }, null])\n }\n */\n }\n }\n else{// como aun no se ha revisado en BD entonces enviamos solicitud al Supervisor\n let matricula = flow.get(\"matricula\")\n //msg.topic = `SELECT v.Matricula, v.Autorizado FROM Vehiculos v WHERE v.Matricula = ('${matricula}')`;\n msg.payload = { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\") ,device: \"supervisor\", accion:\"check\", matricula: matricula }\n \n node.send([null, null, msg]) \n }\n }\n //============================================================= MENU NO ACTIVO ======================================================================================\n else {// MATRICULA en formato, SIN MENU ACTIVO\n //node.warn(\"sin menu, matricula ok\")\n flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"identificacion_esp_aplicada\", true)\n flow.set(\"matricula_ok_flag\", true) // marcamos como matricula conforme para seguir adelante con el proceso\n flow.set(\"identificacion_pendiente\", true) // pendiente de presentar identificacion\n flow.set(\"window_men_m3\", flow.get(\"men_identificacion\"))\n node.send([null, { payload: \"

MATRICULA OK

DEBE PRESENTAR UN QR O TARJETA VALIDA

\" }, null])\n \n //Guardamos la imagen del vehiculo en un archivo. Lo hacemos aqui y no al recibir la imagen por si hubo una edicion de la matricula\n //en ese caso el nombre de la imagen fue regenerado con la nueva matricula\n flow.set(\"matricula_leida_flag\", false) // proceso de matricula ya finalizado, evita entrar aqui otra vez\n let msg_plate = { payload: flow.get(\"matricula_image\"), filename: flow.get(\"path_images\") + flow.get(\"nombre_imagen\") }\n node.send([msg_plate, null])\n\n if (flow.get(\"botonsalida_activo\")) {\n flow.set(\"botonsalida\", true)\n }\n }\n }\n //=============================== MATRICULA FUERA DE FORMATO =====================================\n else {\n // CON Edicion de Matricula\n if (flow.get(\"edicion_matricula\")) { \n if (!flow.get(\"editor_matricula_ok\")) {// Si la edicion ha sido habilitada y aun no hemos sacado el editor de matricula entonces sacamos la ventana de edicion\n flow.set(\"badplate\", true)\n //flow.set(\"badplate_llamado\", false) // permite sacar nuevamente la notificacion para editar matricula\n }\n\n //Caso donde el usuario no hace edicion sino que presenta identificacion\n if(flow.get(\"RFID_revisado\") || flow.get(\"QR_revisado\")){\n flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"identificacion_esp_aplicada\", true)\n flow.set(\"matricula_ok_flag\", true) // marcamos como matricula conforme para seguir adelante con el proceso\n //flow.set(\"identificacion_pendiente\", true) // pendiente de presentar identificacion\n }\n\n }\n\n // SIN Edicion de Matricula\n else if (!flow.get(\"edicion_matricula\")) { // si edicion de matricula no esta habilitada solicitamos que el vehiculo entre de nuevo en la bascula\n //completamos datos del registro para registrar el movimiento al momento que el peso < pmin\n\n // SIN Identificacion Especial\n if (!flow.get(\"identificacion_esp\")) {\n let new_register = flow.get(\"register\")\n new_register.matricula = flow.get(\"matricula\")\n new_register.matriculaeditada = flow.get(\"matricula_editada_flag\")\n new_register.nombre_imagen = flow.get(\"nombre_imagen\")\n new_register.qr = flow.get(\"last_QR\")\n new_register.rfid = flow.get(\"last_RFID\")\n new_register.sentido = flow.get(\"sentido\")\n new_register.botonvalidacion = flow.get(\"salida_valida_flag\")\n\n flow.set(\"register\", new_register)\n flow.set(\"movimiento_registrado_flag\", true)\n //sacamos notificacion en pantalla para volver a entrar en bascula\n node.send([null, { payload: \"

MATRICULA ERRONEA

VUELVA A ENTRAR EN LA BASCULA

\" }, null])\n }\n\n // CON Identificacion Especial y QR o RFID revisado (autorizado)\n //else if (flow.get(\"RFID_revisado\") || flow.get(\"QR_revisado\")) {//caso donde identificacion_esp es verdadero\n else{\n flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"identificacion_esp_aplicada\", true)\n flow.set(\"matricula_ok_flag\", true) // marcamos como matricula conforme para seguir adelante con el proceso\n flow.set(\"identificacion_pendiente\", true) // pendiente de presentar identificacion\n if (flow.get(\"botonsalida_activo\")) {\n flow.set(\"botonsalida\", true)\n }\n node.send([null, { payload: \"

MATRICULA ERRONEA

DEBE PRESENTAR UN QR O TARJETA VALIDA

\" }, null])\n }\n }\n }\n}\n\n//------------------------------------------ Edicion de Matricula ------------------------------------------------------\nif (flow.get(\"badplate\") && !flow.get(\"badplate_llamado\")) { // se ejecuta si no se ha llamado antes\n flow.set(\"badplate_llamado\", true) // Marcamos que hemos sacado la notificacion \n let matricula = flow.get(\"matricula\")\n if (matricula == \"NOT FOUND\" || matricula == \"\"){ // evitamos escribir NOT FOUND en la pantalla de edicion de matricula\n matricula = \"\"\n }\n const matricula_array = matricula.split('')\n const matricula_final = new Array(8) // Tamaño maximo de la matricula\n for (let i = 0; i < matricula_array.length; i++) {\n matricula_final[i] = matricula_array[i];\n }\n flow.set(\"matricula_array\", matricula_final)\n //node.warn(\"matricula_revisada = \" + flow.get(\"matricula_revisada\") + \" matricula = \" + matricula)\n if(repetir_matricula != true){\n node.send([null, {payload:\"

MATRICULA ERRONEA

MODIFIQUE EN LA SIGUIENTE PANTALLA

\", matricula:matricula_final, size:matricula_final.length}])\n }\n else\n setTimeout(() => {\n node.send([null, { payload: \"

MODIFIQUE MATRICULA

EN LA SIGUIENTE PANTALLA

\", matricula: matricula_final, size: matricula_final.length }])\n }, 3000); \n}\n//-------------------------------------------------------------------------------------------------------------------------\n //=============================================================================================================\nreturn;", - "outputs": 3, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 1360, - "y": 1360, - "wires": [ - [], - [], - [] - ] - }, { "id": "0ebfa0099db1ed19", "type": "function", @@ -4513,7 +4490,7 @@ "z": "953e8740401d175c", "g": "9328043d4e9512a9", "name": "QR / RFID", - "func": "\n//if (flow.get(\"identificacion_esp\") && flow.get(\"identificacion_pendiente\") && !flow.get(\"supervisor\")) {\nif (!flow.get(\"nota_resumen_mostrada\") && !flow.get(\"supervisor\")) { \n // hay que chequear identificacion contra algun tipo de autenticacion \n if (flow.get(\"QR_ok_flag\")) {\n if (!flow.get(\"QR_revisado\")) {\n // Solicitamos revision del codigo QR en BD\n msg.payload.numero_vial = flow.get(\"numero_vial\")\n msg.payload.totem_id = flow.get(\"totem_id\")\n msg.payload.device = \"supervisor\"\n msg.payload.accion = \"qr/rfid\"\n msg.payload.tipo = \"qr\"\n msg.payload.id = flow.get(\"last_QR\")\n node.send([{ payload: \"\" }, null, msg]);\n \n }\n else {\n if (flow.get(\"QR_verificado\")) {\n flow.set(\"nota_resumen_mostrada\", true) // evita repeticion de la notificacion con el resumen\n flow.set(\"identificacion_pendiente\", false)\n let cliente = flow.get(\"cliente\") || \"Centro Desconocido\";\n let residuo = flow.get(\"residuo\") || \"Servicio Desconocido\";\n let matricula = flow.get(\"matricula\") || \"Sin Matricula\";\n // Construir el mensaje en formato HTML\n //msg.payload = `

EL CODIGO QR PRESENTADO


VIENE DE: ${nombreCentro}
TRAE: ${servicio}`;\n msg.payload = `
\n
CODIGO QR OK
\n
VIENE DE: ${cliente}
\n
TRAE: ${residuo}
\n
Matricula: ${matricula}
\n
\n `;\n \n \n msg.topic = \"QR_verificado\";\n //flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"startmenu_flag\", false) // Permite que el boton de solicitud de primer menu, en caso de estar en pantalla, se pueda eliminar\n node.send([msg, null, null])\n \n /*\n setTimeout(function () {\n node.send([{ payload: \"\" }, null, null]);\n }, 3000)\n */\n //Eliminamos la pantalla del editor y ponemos la pantalla principal del Totem\n if (flow.get(\"editor_matricula_ok\")) {\n node.send([null, null, null, { \"payload\": { \"tab\": \"Totem\" } }]);\n\n }\n }\n else{\n //aqui va una notificacion de QR no registrado y permitimos que se lea nuevamente la tarjeta\n flow.set(\"QR_revisado\", false)\n flow.set(\"ID_enviado\", false) // permitimos envio de otro ID. Este flag se utiliza en el nodo de \"envio QR / RFID\"\n node.send([{ payload: \"

EL QR NO ESTA REGISTRADO

UTILICE OTRO QR

\" }, null, null])\n }\n }\n }\n else if (flow.get(\"RFID_ok_flag\")) {\n if (!flow.get(\"RFID_revisado\")) {\n // Solicitamos revision del codigo de la tarjeta en BD\n msg.payload.numero_vial = flow.get(\"numero_vial\")\n msg.payload.totem_id = flow.get(\"totem_id\")\n msg.payload.device = \"supervisor\"\n msg.payload.accion = \"qr/rfid\"\n msg.payload.tipo = \"rfid\"\n msg.payload.id = flow.get(\"last_RFID\")\n node.send([{ payload: \"\" }, null, msg]);\n \n }\n else{\n if (flow.get(\"RFID_verificado\") && !flow.get(\"nota_resumen_mostrada\")) {\n flow.set(\"nota_resumen_mostrada\", true) //evita repeticion de la notificacion con el resumen\n flow.set(\"identificacion_pendiente\", false)\n let cliente = flow.get(\"cliente\") || \"Centro Desconocido\";\n let residuo = flow.get(\"residuo\") || \"Servicio Desconocido\";\n // Construir la notificacion en formato HTML\n //msg.payload = `

TARJETA OK

VIENE DE: ${nombreCentro}

TRAE: ${servicio}

`;\n msg.payload = `
\n
Tarjeta OK
\n
VIENE DE: ${cliente}
\n
TRAE: ${residuo}
\n
\n `;\n msg.topic = \"RFID_verificado\";\n //flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"startmenu_flag\", false) // Permite que el boton de solicitud de primer menu, en caso de estar en pantalla, se pueda eliminar\n node.send([msg, null, null])\n //node.warn(\"notificacion\")\n /*\n setTimeout(function () {\n node.send([{ payload: \"\" }, null, null]);\n }, 3000)\n */\n //Eliminamos la pantalla del editor y ponemos la pantalla principal del Totem\n if (flow.get(\"editor_matricula_ok\")) {\n node.send([null, null, null, { \"payload\": { \"tab\": \"Totem\" } }]);\n\n }\n }\n else{\n //aqui va una notificacion de tarjeta no registrada y permitimos que se lea nuevamente la tarjeta\n flow.set(\"RFID_revisado\", false)\n flow.set(\"ID_enviado\", false) // permitimos envio de otro ID\n node.send([{ payload: \"

LA TARJETA NO ESTA REGISTRADA

UTILICE OTRA TARJETA

\" }, null, null])\n }\n }\n }\n \n}\n/*\nif (flow.get(\"identificacion_esp\") && flow.get(\"identificacion_pendiente\") && !flow.get(\"supervisor\")){\n // hay que chequear identificacion contra algun tipo de autenticacion \n if(flow.get(\"QR_ok_flag\") && flow.get(\"last_QR\") == \"myQR is 12345678\"){\n flow.set(\"QR_verificado\", true)\n node.send({ payload: \"\" });\n }\n else if( flow.get(\"RFID_ok_flag\") && flow.get(\"last_RFID\") == 12345678){\n flow.set(\"RFID_verificado\", true)\n node.send({ payload: \"\" });\n }\n}\n*/\nelse if(flow.get(\"supervisor\")){\n msg = {}\n if(msg.id_topic == \"QR\" && flow.get(\"QR_ok_flag\")){\n msg.payload = { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\"), RFID: flow.get(\"last_QR\")}\n node.send([null, msg, null])\n }\n else if(msg.id_topic == \"rfid\" && flow.get(\"RFID_ok_flag\")){\n msg.payload = { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\"), RFID: flow.get(\"last_RFID\")}\n node.send([null, msg, null])\n }\n}\nreturn", + "func": "\n//if (flow.get(\"identificacion_esp\") && flow.get(\"identificacion_pendiente\") && !flow.get(\"supervisor\")) {\nif (!flow.get(\"nota_resumen_mostrada\") && !flow.get(\"supervisor\")) { \n // hay que chequear identificacion contra algun tipo de autenticacion \n if (flow.get(\"QR_ok_flag\")) {\n if (!flow.get(\"QR_revisado\")) {\n // Solicitamos revision del codigo QR en BD\n msg.payload.numero_vial = flow.get(\"numero_vial\")\n msg.payload.totem_id = flow.get(\"totem_id\")\n msg.payload.device = \"supervisor\"\n msg.payload.accion = \"qr/rfid\"\n msg.payload.tipo = \"qr\"\n msg.payload.id = flow.get(\"last_QR\")\n node.send([{ payload: \"\" }, null, msg]);\n \n }\n else {\n if (flow.get(\"QR_verificado\")) {\n flow.set(\"nota_resumen_mostrada\", true) // evita repeticion de la notificacion con el resumen\n flow.set(\"identificacion_pendiente\", false)\n let cliente = flow.get(\"cliente\") || \"Centro Desconocido\";\n let residuo = flow.get(\"residuo\") || \"Servicio Desconocido\";\n // Construir el mensaje en formato HTML\n //msg.payload = `

EL CODIGO QR PRESENTADO


VIENE DE: ${nombreCentro}
TRAE: ${servicio}`;\n msg.payload = `
\n
CODIGO QR OK
\n
VIENE DE: ${cliente}
\n
TRAE: ${residuo}
\n
\n `;\n //
Matricula: ${matricula}
\n \n msg.topic = \"QR_verificado\";\n //flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"startmenu_flag\", false) // Permite que el boton de solicitud de primer menu, en caso de estar en pantalla, se pueda eliminar\n if (flow.get(\"matricula_ok_flag\")){\n node.send([msg, null, null])\n }\n else{\n const matricula_final = new Array(8) // Tamaño maximo de la matricula\n node.send([{payload:\"

SIN MATRICULA

MODIFIQUE EN LA SIGUIENTE PANTALLA

\", matricula:matricula_final, size:matricula_final.length}, null, null])\n }\n \n /*\n setTimeout(function () {\n node.send([{ payload: \"\" }, null, null]);\n }, 3000)\n */\n //Eliminamos la pantalla del editor y ponemos la pantalla principal del Totem\n if (flow.get(\"editor_matricula_ok\")) {\n node.send([null, null, null, { \"payload\": { \"tab\": \"Totem\" } }]);\n\n }\n }\n else{\n //aqui va una notificacion de QR no registrado y permitimos que se lea nuevamente la tarjeta\n flow.set(\"QR_revisado\", false)\n flow.set(\"ID_enviado\", false) // permitimos envio de otro ID. Este flag se utiliza en el nodo de \"envio QR / RFID\"\n node.send([{ payload: \"

EL QR NO ESTA REGISTRADO

UTILICE OTRO QR

\" }, null, null])\n }\n }\n }\n else if (flow.get(\"RFID_ok_flag\")) {\n if (!flow.get(\"RFID_revisado\")) {\n // Solicitamos revision del codigo de la tarjeta en BD\n msg.payload.numero_vial = flow.get(\"numero_vial\")\n msg.payload.totem_id = flow.get(\"totem_id\")\n msg.payload.device = \"supervisor\"\n msg.payload.accion = \"qr/rfid\"\n msg.payload.tipo = \"rfid\"\n msg.payload.id = flow.get(\"last_RFID\")\n node.send([{ payload: \"\" }, null, msg]);\n \n }\n else{\n if (flow.get(\"RFID_verificado\") && !flow.get(\"nota_resumen_mostrada\")) {\n flow.set(\"nota_resumen_mostrada\", true) //evita repeticion de la notificacion con el resumen\n flow.set(\"identificacion_pendiente\", false)\n let cliente = flow.get(\"cliente\") || \"Centro Desconocido\";\n let residuo = flow.get(\"residuo\") || \"Servicio Desconocido\";\n \n // Construir la notificacion en formato HTML\n //msg.payload = `

TARJETA OK

VIENE DE: ${nombreCentro}

TRAE: ${servicio}

`;\n msg.payload = `
\n
Tarjeta OK
\n
VIENE DE: ${cliente}
\n
TRAE: ${residuo}
\n
\n `;\n //
Matricula: ${matricula}
\n msg.topic = \"RFID_verificado\";\n //flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"startmenu_flag\", false) // Permite que el boton de solicitud de primer menu, en caso de estar en pantalla, se pueda eliminar\n node.send([msg, null, null])\n //node.warn(\"notificacion\")\n /*\n setTimeout(function () {\n node.send([{ payload: \"\" }, null, null]);\n }, 3000)\n */\n //Eliminamos la pantalla del editor y ponemos la pantalla principal del Totem\n if (flow.get(\"editor_matricula_ok\")) {\n node.send([null, null, null, { \"payload\": { \"tab\": \"Totem\" } }]);\n\n }\n }\n else{\n //aqui va una notificacion de tarjeta no registrada y permitimos que se lea nuevamente la tarjeta\n flow.set(\"RFID_revisado\", false)\n flow.set(\"ID_enviado\", false) // permitimos envio de otro ID\n node.send([{ payload: \"

LA TARJETA NO ESTA REGISTRADA

UTILICE OTRA TARJETA

\" }, null, null])\n }\n }\n }\n \n}\n/*\nif (flow.get(\"identificacion_esp\") && flow.get(\"identificacion_pendiente\") && !flow.get(\"supervisor\")){\n // hay que chequear identificacion contra algun tipo de autenticacion \n if(flow.get(\"QR_ok_flag\") && flow.get(\"last_QR\") == \"myQR is 12345678\"){\n flow.set(\"QR_verificado\", true)\n node.send({ payload: \"\" });\n }\n else if( flow.get(\"RFID_ok_flag\") && flow.get(\"last_RFID\") == 12345678){\n flow.set(\"RFID_verificado\", true)\n node.send({ payload: \"\" });\n }\n}\n*/\nelse if(flow.get(\"supervisor\")){\n msg = {}\n if(msg.id_topic == \"QR\" && flow.get(\"QR_ok_flag\")){\n msg.payload = { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\"), RFID: flow.get(\"last_QR\")}\n node.send([null, msg, null])\n }\n else if(msg.id_topic == \"rfid\" && flow.get(\"RFID_ok_flag\")){\n msg.payload = { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\"), RFID: flow.get(\"last_RFID\")}\n node.send([null, msg, null])\n }\n}\nreturn", "outputs": 4, "timeout": 0, "noerr": 0, @@ -6191,9 +6168,9 @@ "id": "53335688d117ec96", "type": "comment", "z": "953e8740401d175c", - "name": "Version 1.1 de bascula autonoma", - "info": "**Version 1.1** Se han agregado nos nuevos campos a la tabla movimierntos_cerrados en el supervisor estos campos son \"qr_salida\" y \"rfid_salida\". La presencia de estos \ndos campos es para disponer de la identificaciob utilizada en salida en caso de hacerlo. Para ello en el nodo \"Analisis del modo de Operacion\" se evalua \nsi estamos en el movimiento inicial o final para ver cual campo es el que tenemos que rellenar. Est se hace el la linea nº 100\nSe ha moviso la inicializacion flow.set(\"distance_flag_SET\", false) al momento donde la bascula pasa de peso < pmin por primera vez. \nAntes se inicializaba cada vez que el peso que llegaba era menor que pmin. Esto podia ocasionar un error ya que el nodo detector perdia el control\nde este flag al ser inicializado cada vez que el peso < pmin.\n\nEl nodo \"matricula 2\" sustituye al nodo matricula anterior. Este nuevo contiene todas las modificaciones necesarias para adaptarse a los \nnuevos requerimientos de la bascula automatica\n\nPara que el QR pueda entrar en la planta es necesario que la matricula este disponible.\nEn caso de que la matricula leida sea diferente a la matricula obtenida en la BD luego de enviar el QR se toma la matricula leida de la BD\n\n**version 1.0.** Este codigo de Bascula Autonoma sale a partir del Totem Autonomo. Todo el codigo relativo a la gestion de BAse de Datos se traslada al RPI Supervisor\nEn este RPi solo queda lo relativo a la gestion de sensores, camaras, lectores de Identioficacion, semaforo, barrera y la pantalla para que el usuario \npueda interactuar con el sistema como por ejemplo hacer seleccion del residuo a traves de un menu de seleccion.\n\nEn esta version se ha introducido el termino PMA(Peso Maximo Autorizado. Este es un valor que el Totem recibe cuando el Supervisor le envia la autorizacion\nde la matricula junto con la tara- El Totem revisa el peso estable del vehiculo con el PMA recibidoy en caso de ser superior se envia un aviso en la pantalla\nindicandole al conductor que debe retroceder ya que supera el peso admitido.\n\nOtra función que contiene esta version es el chequeo de la Tara. Si el valor recibido de la Tara es superior a cero entonces el movimiento inicial recinbido por el supervisor \nes enviado como movimiento cerrado al Servidor.Realmente para el Totem es transparente. La gestion de la Tara en efecto la hace el Supervisor una vez que recibe\nel movimiento inicial que envia el Totem.", - "x": 1290, + "name": "Version 1.11 de bascula autonoma", + "info": "**Version 1.11**Se puso una condicion (peso en bascula > pmin) en el nodo \"enviar matricula\" para enviar matricula al nodo de analisis. Esto evita que se este\nenviando matricula si se recibe sin que haya vehiculo en bascula. Esto no evita que se reciban matriculas automaticas antes de entrar el vehiculo en la bascula.\nEstas ultimas fotos se conservan en memoria hasta que el vehiculo entre en la bascula y pueden ser utilizadas como foto principal en caso de fallo en la solicitud.\nHemos eliminado en la linea 156 del nodo matricula2 la condicion de \"qr_revisado\" para eximirlo de disponer de matricula debido a que ahora el codigo qr puede estar asociado a varias matriculas.\ny por lo tanto sera necesario disponer de una matricula a pesar de tener el codigo de autorizacio (solo indica residuo).\nHemos inicializado la matricula [flow.set(\"matricula\", \"Sin Matricula\")] tambien en el momento en que el peso supera a pmin por primera vez (es decir entrando en la bascula).\nSe agrego en la salida de la edicion de matricula [flow.set(\"matriculacheck_solicitada\", false)] para permitir que se busque nuevamente la matricula en BD.\n\n**Version 1.1** Hemos agregado excepcion de obligacion de tener que disponer de matricula para el caso de presentar una tarjeta RFID. Anteriormente se habia puesto en el nodo de \"Analisis\ndel modo de operacion\" (*let matricula_obligatoria = flow.get(\"matricula_obligatoria\") || true // siempre es obligatoria*) una linea para obligar a tener siempre matricula,\nindependiente de lo que este configurado en el archivo de configuracion. Ahora esa linea sigue funcionando pero en el caso de la tarjeta se permite que no haya matricula ya que esta identificacion \ncontiene la matricula unica. Ver linea 53 en el nodo mencionado anteriormente. No es el caso de los QR los cuales puede haber el mismo GUUID asociados a diferentes matriculas.\n\nSe han agregado nos nuevos campos a la tabla movimierntos_cerrados en el supervisor estos campos son \"qr_salida\" y \"rfid_salida\". La presencia de estos \ndos campos es para disponer de la identificaciob utilizada en salida en caso de hacerlo. Para ello en el nodo \"Analisis del modo de Operacion\" se evalua \nsi estamos en el movimiento inicial o final para ver cual campo es el que tenemos que rellenar. Est se hace el la linea nº 100\nSe ha moviso la inicializacion flow.set(\"distance_flag_SET\", false) al momento donde la bascula pasa de peso < pmin por primera vez. \nAntes se inicializaba cada vez que el peso que llegaba era menor que pmin. Esto podia ocasionar un error ya que el nodo detector perdia el control\nde este flag al ser inicializado cada vez que el peso < pmin.\n\nEl nodo \"matricula 2\" sustituye al nodo matricula anterior. Este nuevo contiene todas las modificaciones necesarias para adaptarse a los \nnuevos requerimientos de la bascula automatica\n\nPara que el QR pueda entrar en la planta es necesario que la matricula este disponible.\nEn caso de que la matricula leida sea diferente a la matricula obtenida en la BD luego de enviar el QR se toma la matricula leida de la BD\n\n**version 1.0.** Este codigo de Bascula Autonoma sale a partir del Totem Autonomo. Todo el codigo relativo a la gestion de BAse de Datos se traslada al RPI Supervisor\nEn este RPi solo queda lo relativo a la gestion de sensores, camaras, lectores de Identioficacion, semaforo, barrera y la pantalla para que el usuario \npueda interactuar con el sistema como por ejemplo hacer seleccion del residuo a traves de un menu de seleccion.\n\nEn esta version se ha introducido el termino PMA(Peso Maximo Autorizado. Este es un valor que el Totem recibe cuando el Supervisor le envia la autorizacion\nde la matricula junto con la tara- El Totem revisa el peso estable del vehiculo con el PMA recibidoy en caso de ser superior se envia un aviso en la pantalla\nindicandole al conductor que debe retroceder ya que supera el peso admitido.\n\nOtra función que contiene esta version es el chequeo de la Tara. Si el valor recibido de la Tara es superior a cero entonces el movimiento inicial recinbido por el supervisor \nes enviado como movimiento cerrado al Servidor.Realmente para el Totem es transparente. La gestion de la Tara en efecto la hace el Supervisor una vez que recibe\nel movimiento inicial que envia el Totem.", + "x": 1300, "y": 800, "wires": [] }, @@ -6620,7 +6597,7 @@ "z": "953e8740401d175c", "g": "9328043d4e9512a9", "name": "matricula-2", - "func": "// DEFINICION DE ALGUNOS FLAGS UTILIZADOS EN EL NODO\n//matricula_leida_flag: Si es igual a true, indica que hemos recibido matrícula de la camara.La matrícula puede ser valida o no.Sólo indica recepción de objeto de camara\n//peso_bajo_flag: Si es igual a true, indica que el ESTADO del peso esta por debajo del peso minimo.\n//Sirve para tomar unas acciones una sola vez cuándo se detecta peso > pmin(el flag esta en true en ese momento) y luego el flag pasa a false es decir el ESTADO ahora es peso por encima del minimo.\n//matricula_revisada: Si true, indica que la matrícula ha sido revisada en la Base de Datos\n//matricula_autorizada: Si true, indica que la matrícula ha sido encontrada en la base de datos y esta autorizada es decir dispone de un contrato por lo tanto el usuario va a recibir un menu en pantalla.\n//matricula_ok_flag : Si igual a true indica que el proceso de lectura de matrícula (camara o edicion en pantalla) ha sido completado satisfactoriamente y el sistema puede seguir adelante.\n//matricula_formato_flag: Si es igual a true indica que la matrícula recibida de la camara tiene el formato adecuado o que el conductor ha introducido en la pantalla una matrícula correcta en formato.\n//edicion_matricula: Si true, indica que el usuario puede utilizar el editor de matrícula en caso de error de lectura, para colocar la matrícula correcta.\n//editor_matricula_ok: Si true, indica que el usuario ha aceptado abrir el editor de matrículas.\n\n\n//====================================== Chequea validez de Matricula ========================================\nlet repetir_matricula = false // variable para gestionar repeticion de la edicion de matricula en caso de error en la introduccion\nif (flow.get(\"matricula_leida_flag\") && !flow.get(\"supervisor\") && flow.get(\"totem_master\") && !flow.get(\"peso_bajo_flag\")) { // Primero verifica si se ha leido y si esta aun en proceso\n if (flow.get(\"matricula_formato_flag\")) {// Verifica si la matricula recibida o editada esta en formato\n flow.set(\"matricula_ok_flag\", true) // matricula conforme en formato para seguir adelante con el proceso\n if (flow.get(\"matricula_revisada\")) {//chequea si ya se ha revisado la existencia de la matricula en BD\n if (flow.get(\"matricula_autorizada\")) {// Revisa si la matricula esta autorizada en BD\n flow.set(\"matricula_leida_flag\", false) // proceso de matricula ya finalizado, evita entrar aqui otra vez\n if (flow.get(\"tipo_movimiento\") == \"final\" && flow.get(\"botonsalida\") == false) {\n //node.warn(\"activado boton de salida\")\n flow.set(\"botonsalida\", true)\n }\n else if (flow.get(\"tipo_movimiento\") == \"inicial\" && !flow.get(\"menu_activo\")) {\n flow.set(\"window_men_m3\", flow.get(\"men_identificacion\")); \n }\n }\n else {\n\n // SIN edicion de matricula\n if (!flow.get(\"edicion_matricula\") && !flow.get(\"nota_avise_basculista_done\")) {\n node.send([null, { payload: \"

MATRICULA NO REGISTRADA

AVISE AL BASCULISTA

\" }, null])\n flow.set(\"nota_avise_basculista_done\", true)\n }\n\n // Matricula editada anteriormente\n else if (flow.get(\"editor_matricula_ok\") && !flow.get(\"nota_vuelva_intentar_done\")) {\n node.send([null, { payload: \"

MATRICULA NO REGISTRADA

VUELVA A INTENTARLO

\" }, null])\n flow.set(\"nota_vuelva_intentar_done\", true)\n flow.set(\"badplate\", true) // para poder volver a sacar anuncio de matricula mala y editor de matricula\n flow.set(\"badplate_llamado\", false)\n repetir_matricula = true // para poder hacer un delay antes de sacar anuncio de editor\n }\n\n // Edicion de Matricula\n else if (flow.get(\"edicion_matricula\") && !flow.get(\"nota_modifique_matricula_done\")) {\n node.send([null, { payload: \"

MATRICULA NO REGISTRADA

MODIFIQUE MATRICULA

\" }, null])\n flow.set(\"nota_modifique_matricula_done\", true)\n flow.set(\"nota_vuelva_intentar_done\", true)\n flow.set(\"badplate\", true) // para poder volver a sacar anuncio de matricula mala y editor de matricula\n repetir_matricula = true // para poder hacer un delay antes de sacar anuncio de editor\n }\n /*\n //CON identificacion especial\n else if (flow.get(\"identificacion_esp\")) {\n flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"identificacion_esp_aplicada\", true)\n flow.set(\"matricula_ok_flag\", true) // marcamos como matricula conforme para seguir adelante con el proceso\n flow.set(\"identificacion_pendiente\", true) // pendiente de presentar identificacion\n if (flow.get(\"botonsalida_activo\")) {\n flow.set(\"botonsalida\", true)\n }\n node.send([null, { payload: \"

MATRICULA ERRONEA

DEBE PRESENTAR UN QR O TARJETA VALIDA

\" }, null])\n }\n \n if (((flow.get(\"QR_revisado\") && flow.get(\"QR_verificado\")) || (flow.get(\"QR_revisado\") && flow.get(\"QR_verificado\"))) && flow.get(\"matricula_autorizada\")){\n\n }\n */\n }\n }\n else {// como aun no se ha revisado en BD entonces enviamos solicitud al Supervisor\n if(!flow.get(\"matriculacheck_solicitada\")){\n let matricula = flow.get(\"matricula\")\n //msg.topic = `SELECT v.Matricula, v.Autorizado FROM Vehiculos v WHERE v.Matricula = ('${matricula}')`;\n msg.payload = { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\"), device: \"supervisor\", accion: \"check\", matricula: matricula }\n node.send([null, null, msg])\n flow.set(\"matriculacheck_solicitada\", true) // marca que se solicito revision de matricula\n setTimeout(function () { // timer para revisar si recibimos respuesta de BD\n if(!flow.get(\"matricula_revisada\")){ // Si matricula no ha sido revisada se vuelve a activar el chequeo de la matricula\n flow.set(\"matriculacheck_solicitada\", false)\n node.send([{payload:1}, null, null])\n }\n }, 5000)\n \n }\n }\n \n /*\n \n if(flow.get(\"menu_activo\")){// chequea si el totem debe estar pendiente de las matriculas y los contratos\n //================================================== MENU ACTIVO ================================================================================\n \n }\n //============================================================= MENU NO ACTIVO ======================================================================================\n else {// MATRICULA en formato, SIN MENU ACTIVO\n //node.warn(\"sin menu, matricula ok\")\n \n flow.set(\"identificacion_pendiente\", true) // pendiente de presentar identificacion\n flow.set(\"window_men_m3\", flow.get(\"men_identificacion\"))\n //node.send([null, { payload: \"

MATRICULA OK

DEBE PRESENTAR UN QR O TARJETA VALIDA

\" }, null])\n let matricula = flow.get(\"matricula\")\n msg.payload = { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\"), device: \"supervisor\", accion: \"check\", matricula: matricula }\n node.send([null, null, msg]) \n //Guardamos la imagen del vehiculo en un archivo. Lo hacemos aqui y no al recibir la imagen por si hubo una edicion de la matricula\n //en ese caso el nombre de la imagen fue regenerado con la nueva matricula\n //flow.set(\"matricula_leida_flag\", false) // proceso de matricula ya finalizado, evita entrar aqui otra vez\n let msg_plate = { payload: flow.get(\"matricula_image\"), filename: flow.get(\"path_images\") + flow.get(\"nombre_imagen\") }\n node.send([msg_plate, null])\n\n }\n */\n }\n //=============================== MATRICULA FUERA DE FORMATO =====================================\n else {\n // CON Edicion de Matricula\n if (flow.get(\"edicion_matricula\")) { \n if (!flow.get(\"editor_matricula_ok\")) {// Si la edicion ha sido habilitada y aun no hemos sacado el editor de matricula entonces sacamos la ventana de edicion\n flow.set(\"badplate\", true)\n //flow.set(\"badplate_llamado\", false) // permite sacar nuevamente la notificacion para editar matricula\n }\n\n //Caso donde el usuario no hace edicion sino que presenta identificacion\n if(flow.get(\"RFID_revisado\") || flow.get(\"QR_revisado\")){\n flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"identificacion_esp_aplicada\", true)\n flow.set(\"matricula_ok_flag\", true) // marcamos como matricula conforme para seguir adelante con el proceso\n //flow.set(\"identificacion_pendiente\", true) // pendiente de presentar identificacion\n }\n\n }\n\n // SIN Edicion de Matricula\n else if (!flow.get(\"edicion_matricula\")) { // si edicion de matricula no esta habilitada solicitamos que el vehiculo entre de nuevo en la bascula\n //completamos datos del registro para registrar el movimiento al momento que el peso < pmin\n \n //node.send([null, { payload: \"

MATRICULA ERRONEA

VUELVA A ENTRAR EN LA BASCULA O PRESENTE UNA IDENTIFICACION

\" }, null])\n let matricula = flow.get(\"matricula\")\n node.send([\n null,\n {\n payload:\n \"
\" +\n \"

MATRICULA ERRONEA

\" +\n \"

Matrícula: \" + matricula + \"

\" +\n \"

VUELVA A ENTRAR EN LA BASCULA O PRESENTE UNA IDENTIFICACION

\" +\n \"
\"\n },\n null\n ]);\n\n\n\n\n\n\n//Tengo que analizar el caso cuando no hay editor de matricula . Hay que salir de la bascula o presentar un ID para verificar la matricula asociada\n// **************************************************************************************\n\n\n/* PARTE ANTERIOR *******************************************************************\n\n // SIN Identificacion Especial\n if (!flow.get(\"identificacion_esp\")) {\n let new_register = flow.get(\"register\")\n new_register.matricula = flow.get(\"matricula\")\n new_register.matriculaeditada = flow.get(\"matricula_editada_flag\")\n new_register.nombre_imagen = flow.get(\"nombre_imagen\")\n new_register.qr = flow.get(\"last_QR\")\n new_register.rfid = flow.get(\"last_RFID\")\n new_register.sentido = flow.get(\"sentido\")\n new_register.botonvalidacion = flow.get(\"salida_valida_flag\")\n\n flow.set(\"register\", new_register)\n flow.set(\"movimiento_registrado_flag\", true)\n //sacamos notificacion en pantalla para volver a entrar en bascula\n node.send([null, { payload: \"

MATRICULA ERRONEA

VUELVA A ENTRAR EN LA BASCULA

\" }, null])\n }\n\n // CON Identificacion Especial y QR o RFID revisado (autorizado)\n //else if (flow.get(\"RFID_revisado\") || flow.get(\"QR_revisado\")) {//caso donde identificacion_esp es verdadero\n else{\n flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"identificacion_esp_aplicada\", true)\n flow.set(\"matricula_ok_flag\", true) // marcamos como matricula conforme para seguir adelante con el proceso\n flow.set(\"identificacion_pendiente\", true) // pendiente de presentar identificacion\n if (flow.get(\"botonsalida_activo\")) {\n flow.set(\"botonsalida\", true)\n }\n node.send([null, { payload: \"

MATRICULA ERRONEA

DEBE PRESENTAR UN QR O TARJETA VALIDA

\" }, null])\n }\n\n************************************************************************************/\n\n }\n }\n}\n\n//------------------------------------------ Edicion de Matricula ------------------------------------------------------\nif (flow.get(\"badplate\") && !flow.get(\"badplate_llamado\")) { // se ejecuta si no se ha llamado antes\n flow.set(\"badplate_llamado\", true) // Marcamos que hemos sacado la notificacion \n let matricula = flow.get(\"matricula\")\n if (matricula == \"NOT FOUND\" || matricula == \"\"){ // evitamos escribir NOT FOUND en la pantalla de edicion de matricula\n matricula = \"\"\n }\n const matricula_array = matricula.split('')\n const matricula_final = new Array(8) // Tamaño maximo de la matricula\n for (let i = 0; i < matricula_array.length; i++) {\n matricula_final[i] = matricula_array[i];\n }\n flow.set(\"matricula_array\", matricula_final)\n //node.warn(\"matricula_revisada = \" + flow.get(\"matricula_revisada\") + \" matricula = \" + matricula)\n if(repetir_matricula != true){\n node.send([null, {payload:\"

MATRICULA ERRONEA

MODIFIQUE EN LA SIGUIENTE PANTALLA

\", matricula:matricula_final, size:matricula_final.length}])\n }\n else\n setTimeout(() => {\n node.send([null, { payload: \"

MODIFIQUE MATRICULA

EN LA SIGUIENTE PANTALLA

\", matricula: matricula_final, size: matricula_final.length }])\n }, 3000); \n}\n//-------------------------------------------------------------------------------------------------------------------------\n //=============================================================================================================\nreturn;", + "func": "// DEFINICION DE ALGUNOS FLAGS UTILIZADOS EN EL NODO\n//matricula_leida_flag: Si es igual a true, indica que hemos recibido matrícula de la camara.La matrícula puede ser valida o no.Sólo indica recepción de objeto de camara\n//peso_bajo_flag: Si es igual a true, indica que el ESTADO del peso esta por debajo del peso minimo.\n//Sirve para tomar unas acciones una sola vez cuándo se detecta peso > pmin(el flag esta en true en ese momento) y luego el flag pasa a false es decir el ESTADO ahora es peso por encima del minimo.\n//matricula_revisada: Si true, indica que la matrícula ha sido revisada en la Base de Datos\n//matricula_autorizada: Si true, indica que la matrícula ha sido encontrada en la base de datos y esta autorizada es decir dispone de un contrato por lo tanto el usuario va a recibir un menu en pantalla.\n//matricula_ok_flag : Si igual a true indica que el proceso de lectura de matrícula (camara o edicion en pantalla) ha sido completado satisfactoriamente y el sistema puede seguir adelante.\n//matricula_formato_flag: Si es igual a true indica que la matrícula recibida de la camara tiene el formato adecuado o que el conductor ha introducido en la pantalla una matrícula correcta en formato.\n//edicion_matricula: Si true, indica que el usuario puede utilizar el editor de matrícula en caso de error de lectura, para colocar la matrícula correcta.\n//editor_matricula_ok: Si true, indica que el usuario ha aceptado abrir el editor de matrículas.\n\n\n//====================================== Chequea validez de Matricula ========================================\nlet repetir_matricula = false // variable para gestionar repeticion de la edicion de matricula en caso de error en la introduccion\nif (flow.get(\"matricula_leida_flag\") && !flow.get(\"supervisor\") && flow.get(\"totem_master\") && !flow.get(\"peso_bajo_flag\")) { // Primero verifica si se ha leido y si esta aun en proceso\n if (flow.get(\"matricula_formato_flag\")) {// Verifica si la matricula recibida o editada esta en formato\n flow.set(\"matricula_ok_flag\", true) // matricula conforme en formato para seguir adelante con el proceso\n if (flow.get(\"matricula_revisada\")) {//chequea si ya se ha revisado la existencia de la matricula en BD\n if (flow.get(\"matricula_autorizada\")) {// Revisa si la matricula esta autorizada en BD\n flow.set(\"matricula_leida_flag\", false) // proceso de matricula ya finalizado, evita entrar aqui otra vez\n if (flow.get(\"tipo_movimiento\") == \"final\" && flow.get(\"botonsalida\") == false) {\n //node.warn(\"activado boton de salida\")\n flow.set(\"botonsalida\", true)\n }\n else if (flow.get(\"tipo_movimiento\") == \"inicial\" && !flow.get(\"menu_activo\")) {\n flow.set(\"window_men_m3\", flow.get(\"men_identificacion\")); \n }\n }\n else {\n\n // SIN edicion de matricula\n if (!flow.get(\"edicion_matricula\") && !flow.get(\"nota_avise_basculista_done\")) {\n node.send([null, { payload: \"

MATRICULA NO REGISTRADA

AVISE AL BASCULISTA

\" }, null])\n flow.set(\"nota_avise_basculista_done\", true)\n }\n\n // Matricula editada anteriormente\n else if (flow.get(\"editor_matricula_ok\") && !flow.get(\"nota_vuelva_intentar_done\")) {\n node.send([null, { payload: \"

MATRICULA NO REGISTRADA

VUELVA A INTENTARLO

\" }, null])\n flow.set(\"nota_vuelva_intentar_done\", true)\n flow.set(\"badplate\", true) // para poder volver a sacar anuncio de matricula mala y editor de matricula\n flow.set(\"badplate_llamado\", false)\n repetir_matricula = true // para poder hacer un delay antes de sacar anuncio de editor\n }\n\n // Edicion de Matricula\n else if (flow.get(\"edicion_matricula\") && !flow.get(\"nota_modifique_matricula_done\")) {\n node.send([null, { payload: \"

MATRICULA NO REGISTRADA

MODIFIQUE MATRICULA

\" }, null])\n flow.set(\"nota_modifique_matricula_done\", true)\n flow.set(\"nota_vuelva_intentar_done\", true)\n flow.set(\"badplate\", true) // para poder volver a sacar anuncio de matricula mala y editor de matricula\n repetir_matricula = true // para poder hacer un delay antes de sacar anuncio de editor\n }\n /*\n //CON identificacion especial\n else if (flow.get(\"identificacion_esp\")) {\n flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"identificacion_esp_aplicada\", true)\n flow.set(\"matricula_ok_flag\", true) // marcamos como matricula conforme para seguir adelante con el proceso\n flow.set(\"identificacion_pendiente\", true) // pendiente de presentar identificacion\n if (flow.get(\"botonsalida_activo\")) {\n flow.set(\"botonsalida\", true)\n }\n node.send([null, { payload: \"

MATRICULA ERRONEA

DEBE PRESENTAR UN QR O TARJETA VALIDA

\" }, null])\n }\n \n if (((flow.get(\"QR_revisado\") && flow.get(\"QR_verificado\")) || (flow.get(\"QR_revisado\") && flow.get(\"QR_verificado\"))) && flow.get(\"matricula_autorizada\")){\n\n }\n */\n }\n }\n else {// como aun no se ha revisado en BD entonces enviamos solicitud al Supervisor\n if(!flow.get(\"matriculacheck_solicitada\")){\n let matricula = flow.get(\"matricula\")\n //msg.topic = `SELECT v.Matricula, v.Autorizado FROM Vehiculos v WHERE v.Matricula = ('${matricula}')`;\n msg.payload = { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\"), device: \"supervisor\", accion: \"check\", matricula: matricula }\n node.send([null, null, msg])\n flow.set(\"matriculacheck_solicitada\", true) // marca que se solicito revision de matricula\n setTimeout(function () { // timer para revisar si recibimos respuesta de BD\n if(!flow.get(\"matricula_revisada\")){ // Si matricula no ha sido revisada se vuelve a activar el chequeo de la matricula\n flow.set(\"matriculacheck_solicitada\", false)\n node.send([{payload:1}, null, null])\n }\n }, 5000)\n \n }\n }\n \n /*\n \n if(flow.get(\"menu_activo\")){// chequea si el totem debe estar pendiente de las matriculas y los contratos\n //================================================== MENU ACTIVO ================================================================================\n \n }\n //============================================================= MENU NO ACTIVO ======================================================================================\n else {// MATRICULA en formato, SIN MENU ACTIVO\n //node.warn(\"sin menu, matricula ok\")\n \n flow.set(\"identificacion_pendiente\", true) // pendiente de presentar identificacion\n flow.set(\"window_men_m3\", flow.get(\"men_identificacion\"))\n //node.send([null, { payload: \"

MATRICULA OK

DEBE PRESENTAR UN QR O TARJETA VALIDA

\" }, null])\n let matricula = flow.get(\"matricula\")\n msg.payload = { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\"), device: \"supervisor\", accion: \"check\", matricula: matricula }\n node.send([null, null, msg]) \n //Guardamos la imagen del vehiculo en un archivo. Lo hacemos aqui y no al recibir la imagen por si hubo una edicion de la matricula\n //en ese caso el nombre de la imagen fue regenerado con la nueva matricula\n //flow.set(\"matricula_leida_flag\", false) // proceso de matricula ya finalizado, evita entrar aqui otra vez\n let msg_plate = { payload: flow.get(\"matricula_image\"), filename: flow.get(\"path_images\") + flow.get(\"nombre_imagen\") }\n node.send([msg_plate, null])\n\n }\n */\n }\n //=============================== MATRICULA FUERA DE FORMATO =====================================\n else {\n // CON Edicion de Matricula\n if (flow.get(\"edicion_matricula\")) { \n if (!flow.get(\"editor_matricula_ok\")) {// Si la edicion ha sido habilitada y aun no hemos sacado el editor de matricula entonces sacamos la ventana de edicion\n flow.set(\"badplate\", true)\n //flow.set(\"badplate_llamado\", false) // permite sacar nuevamente la notificacion para editar matricula\n }\n\n //Caso donde el usuario no hace edicion sino que presenta identificacion\n //if(flow.get(\"RFID_revisado\") || flow.get(\"qr_revisado\")){\n if(flow.get(\"RFID_revisado\")){ // consideramos solo tarjeta ya que el QR puede estar asociado a varias matriculas\n flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"identificacion_esp_aplicada\", true)\n flow.set(\"matricula_ok_flag\", true) // marcamos como matricula conforme para seguir adelante con el proceso\n //flow.set(\"identificacion_pendiente\", true) // pendiente de presentar identificacion\n }\n\n }\n\n // SIN Edicion de Matricula\n else if (!flow.get(\"edicion_matricula\")) { // si edicion de matricula no esta habilitada solicitamos que el vehiculo entre de nuevo en la bascula\n //completamos datos del registro para registrar el movimiento al momento que el peso < pmin\n \n //node.send([null, { payload: \"

MATRICULA ERRONEA

VUELVA A ENTRAR EN LA BASCULA O PRESENTE UNA IDENTIFICACION

\" }, null])\n let matricula = flow.get(\"matricula\")\n node.send([\n null,\n {\n payload:\n \"
\" +\n \"

MATRICULA ERRONEA

\" +\n \"

Matrícula: \" + matricula + \"

\" +\n \"

VUELVA A ENTRAR EN LA BASCULA O PRESENTE UNA IDENTIFICACION

\" +\n \"
\"\n },\n null\n ]);\n\n\n\n\n\n\n//Tengo que analizar el caso cuando no hay editor de matricula . Hay que salir de la bascula o presentar un ID para verificar la matricula asociada\n// **************************************************************************************\n\n\n/* PARTE ANTERIOR *******************************************************************\n\n // SIN Identificacion Especial\n if (!flow.get(\"identificacion_esp\")) {\n let new_register = flow.get(\"register\")\n new_register.matricula = flow.get(\"matricula\")\n new_register.matriculaeditada = flow.get(\"matricula_editada_flag\")\n new_register.nombre_imagen = flow.get(\"nombre_imagen\")\n new_register.qr = flow.get(\"last_QR\")\n new_register.rfid = flow.get(\"last_RFID\")\n new_register.sentido = flow.get(\"sentido\")\n new_register.botonvalidacion = flow.get(\"salida_valida_flag\")\n\n flow.set(\"register\", new_register)\n flow.set(\"movimiento_registrado_flag\", true)\n //sacamos notificacion en pantalla para volver a entrar en bascula\n node.send([null, { payload: \"

MATRICULA ERRONEA

VUELVA A ENTRAR EN LA BASCULA

\" }, null])\n }\n\n // CON Identificacion Especial y QR o RFID revisado (autorizado)\n //else if (flow.get(\"RFID_revisado\") || flow.get(\"QR_revisado\")) {//caso donde identificacion_esp es verdadero\n else{\n flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"identificacion_esp_aplicada\", true)\n flow.set(\"matricula_ok_flag\", true) // marcamos como matricula conforme para seguir adelante con el proceso\n flow.set(\"identificacion_pendiente\", true) // pendiente de presentar identificacion\n if (flow.get(\"botonsalida_activo\")) {\n flow.set(\"botonsalida\", true)\n }\n node.send([null, { payload: \"

MATRICULA ERRONEA

DEBE PRESENTAR UN QR O TARJETA VALIDA

\" }, null])\n }\n\n************************************************************************************/\n\n }\n }\n}\n\n//------------------------------------------ Edicion de Matricula ------------------------------------------------------\nif (flow.get(\"badplate\") && !flow.get(\"badplate_llamado\")) { // se ejecuta si no se ha llamado antes\n flow.set(\"badplate_llamado\", true) // Marcamos que hemos sacado la notificacion \n let matricula = flow.get(\"matricula\")\n if (matricula == \"NOT FOUND\" || matricula == \"\"){ // evitamos escribir NOT FOUND en la pantalla de edicion de matricula\n matricula = \"\"\n }\n const matricula_array = matricula.split('')\n const matricula_final = new Array(8) // Tamaño maximo de la matricula\n for (let i = 0; i < matricula_array.length; i++) {\n matricula_final[i] = matricula_array[i];\n }\n flow.set(\"matricula_array\", matricula_final)\n //node.warn(\"matricula_revisada = \" + flow.get(\"matricula_revisada\") + \" matricula = \" + matricula)\n if(repetir_matricula != true){\n node.send([null, {payload:\"

MATRICULA ERRONEA

MODIFIQUE EN LA SIGUIENTE PANTALLA

\", matricula:matricula_final, size:matricula_final.length}])\n }\n else\n setTimeout(() => {\n node.send([null, { payload: \"

MODIFIQUE MATRICULA

EN LA SIGUIENTE PANTALLA

\", matricula: matricula_final, size: matricula_final.length }])\n }, 3000); \n}\n//-------------------------------------------------------------------------------------------------------------------------\n //=============================================================================================================\nreturn;", "outputs": 3, "timeout": 0, "noerr": 0,