Agrega Reportes, valida borrado Rol, agrega texto llegada a Api y valida gtfs

develop/Ronald
Ronald Morales 2024-03-17 02:55:52 -03:00
parent 68c4f6a272
commit 62128c09db
8 changed files with 601 additions and 192 deletions

View File

@ -26,4 +26,7 @@ SMTP_FROM='"Sistema Transporte" <francisco.sandoval@outlook.cl>'
# PATH UPLOAD # PATH UPLOAD
GTFS_UPLOADS=/uploads/gtfs GTFS_UPLOADS=/uploads/gtfs
PHOTOS_UPLOADS=/uploads/photos PHOTOS_UPLOADS=/uploads/photos
# URL INFO PARADERO
URL_PARADERO='http://localhost:3001/rutaParadero/?id='

View File

@ -1,222 +1,358 @@
DO $$
DECLARE
inicio_vigencia DATE;
v_error TEXT := '';
BEGIN
ALTER TABLE linea_paradero drop CONSTRAINT IF EXISTS linea_paradero_id_linea_fkey; -- Verificar agency_id único
IF (SELECT COUNT(*) FROM (SELECT agency_id FROM z_agency GROUP BY agency_id HAVING COUNT(*) > 1) AS duplicated) > 0 THEN
update gtfs_archivo
set status = 'Error - Agency_id duplicados'
where trim(upper(status))='PROCESANDO' ;
v_error:= '1 La validacion de archivos detecto errores en los archivos GTFS';
END IF;
-- Verificar route_id único
IF (SELECT COUNT(*) FROM (SELECT route_id FROM z_routes GROUP BY route_id HAVING COUNT(*) > 1) AS duplicated) > 0 THEN
update gtfs_archivo
set status = 'Error - Route_id duplicados'
where trim(upper(status))='PROCESANDO' ;
v_error:= '2 La validacion de archivos detecto errores en los archivos GTFS';
END IF;
----- -- Verificar service_id único en calendar
IF (SELECT COUNT(*) FROM (SELECT service_id FROM z_calendar GROUP BY service_id HAVING COUNT(*) > 1) AS duplicated) > 0 THEN
update gtfs_archivo
set status = 'Error - service_id duplicados en calendar'
where trim(upper(status))='PROCESANDO' ;
v_error:= '3 La validacion de archivos detecto errores en los archivos GTFS';
END IF;
ALTER TABLE gtfs_stop_times drop CONSTRAINT IF EXISTS fk_gtfs_sto_reference_gtfs_tri; -- Verificar trip_id único
IF (SELECT COUNT(*) FROM (SELECT trip_id FROM z_trips GROUP BY trip_id HAVING COUNT(*) > 1) AS duplicated) > 0 THEN
update gtfs_archivo
set status = 'Error - Trip_id duplicados '
where trim(upper(status))='PROCESANDO' ;
v_error:= '4 La validacion de archivos detecto errores en los archivos GTFS';
END IF;
----- -- Verificar stop_id único
IF (SELECT COUNT(*) FROM (SELECT stop_id FROM z_stops GROUP BY stop_id HAVING COUNT(*) > 1) AS duplicated) > 0 THEN
update gtfs_archivo
set status = 'Error - Stop_id duplicados'
where trim(upper(status))='PROCESANDO' ;
v_error:= '5 La validacion de archivos detecto errores en los archivos GTFS';
END IF;
ALTER TABLE gtfs_frequencie drop CONSTRAINT IF EXISTS fk_gtfs_fre_reference_gtfs_tri; -- Verificar referencias cruzadas entre trips y routes
IF (SELECT COUNT(*) FROM z_trips WHERE route_id NOT IN (SELECT route_id FROM z_routes)) > 0 THEN
update gtfs_archivo
set status = 'Error - Trips_id con route_id que no existen'
where trim(upper(status))='PROCESANDO' ;
v_error:= '6 La validacion de archivos detecto errores en los archivos GTFS';
END IF;
----- -- Verificar referencias cruzadas entre stop_times y trips
IF (SELECT COUNT(*) FROM z_stop_times WHERE trip_id NOT IN (SELECT trip_id FROM z_trips)) > 0 THEN
update gtfs_archivo
set status = 'Error - Stop_times con trips_id que no existen'
where trim(upper(status))='PROCESANDO' ;
v_error:= '7 La validacion de archivos detecto errores en los archivos GTFS';
END IF;
DELETE FROM gtfs_calendar; -- Verificar referencias cruzadas entre stop_times y stops
IF (SELECT COUNT(*) FROM z_stop_times WHERE stop_id NOT IN (SELECT stop_id FROM z_stops)) > 0 THEN
update gtfs_archivo
set status = 'Error - stop_time con stop_id que no existen'
where trim(upper(status))='PROCESANDO' ;
v_error:= '8 La validacion de archivos detecto errores en los archivos GTFS';
END IF;
----- /*WITH inicio_calendar AS (
SELECT MIN(start_date) AS inicio FROM z_calendar
), inicio_calendar_dates AS (
SELECT MIN(date) AS inicio FROM z_calendar_dates WHERE exception_type = 1
)
SELECT LEAST(
COALESCE((SELECT inicio FROM inicio_calendar), CURRENT_DATE),
COALESCE((SELECT inicio FROM inicio_calendar_dates), CURRENT_DATE)
) INTO inicio_vigencia;*/
insert into gtfs_calendar SELECT MIN(start_date) INTO inicio_vigencia FROM z_calendar;
select service_id, monday::bool , tuesday::bool , wednesday::bool , thursday::bool ,friday::bool ,saturday::bool ,sunday::bool
from z_calendar zc;
-----
IF CURRENT_DATE < inicio_vigencia THEN
update gtfs_archivo
set status = 'PENDIENTE' , valid_from= inicio_vigencia
where trim(upper(status))='PROCESANDO' ;
v_error:= '9 EL ARCHIVO AUN NO ESTA VIGENTE POR FECHA';
END IF;
if v_error = '' THEN
update paradero update gtfs_archivo
set vigente = true, set vigente = False
stop_name= (select stop_name from z_stops where stop_id=paradero.id_paradero::text limit 1 ), where vigente = true and id_red in
stop_desc=(select stop_desc from z_stops where stop_id=paradero.id_paradero::text limit 1 ), (select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' );
stop_lat =(select stop_lat from z_stops where stop_id=paradero.id_paradero::text limit 1)::float(8),
stop_lon =(select stop_lon from z_stops where stop_id=paradero.id_paradero::text limit 1)::float(8),
stop_code=(select stop_code from z_stops where stop_id=paradero.id_paradero::text limit 1)
where id_paradero::text in (select stop_id from z_stops );
-----
insert into paradero ALTER TABLE linea_paradero drop CONSTRAINT IF EXISTS linea_paradero_id_linea_fkey;
select
stop_id, null as id_comuna, null as id_tipo_paradero, true,
stop_code , stop_name , stop_desc , stop_lat::float(8) , stop_lon::float(8) , zone_id ,
stop_url , location_type ,
parent_station ,null as stop_time_zone , wheelchair_boarding::numeric
from z_stops zs
where stop_id not in (select id_paradero::text from paradero);
----- -----
delete from linea_paradero; ALTER TABLE gtfs_stop_times drop CONSTRAINT IF EXISTS fk_gtfs_sto_reference_gtfs_tri;
----- -----
delete from linea; ALTER TABLE gtfs_frequencie drop CONSTRAINT IF EXISTS fk_gtfs_fre_reference_gtfs_tri;
----- -----
update linea DELETE FROM gtfs_calendar;
set vigente = false
where id_red in (select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' )
and id_linea not in (
select trim(zr.route_id)||'-'||trim(zt.direction_id::varchar)
from z_routes zr
inner join z_trips zt on zr.route_id =zt.route_id
);
----- -----
update linea insert into gtfs_calendar
set vigente = true select service_id, monday::bool , tuesday::bool , wednesday::bool , thursday::bool ,friday::bool ,saturday::bool ,sunday::bool
where id_red in (select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' ) from z_calendar zc;
and id_linea in (
select trim(zr.route_id)||'-'||trim(zt.direction_id::varchar)
from z_routes zr
inner join z_trips zt on zr.route_id =zt.route_id
);
----- -----
insert into linea update paradero
select distinct set vigente = true,
trim(zr.route_id)||'-'||trim(zt.direction_id::varchar) as route_id, stop_name= (select stop_name from z_stops where stop_id=paradero.id_paradero::text limit 1 ),
null,--zr.agency_id , stop_desc=(select stop_desc from z_stops where stop_id=paradero.id_paradero::text limit 1 ),
substring(zt.trip_headsign FROM '(\S+) -') as route_short_name , stop_lat =(select stop_lat from z_stops where stop_id=paradero.id_paradero::text limit 1)::float(8),
zr.route_desc , stop_lon =(select stop_lon from z_stops where stop_id=paradero.id_paradero::text limit 1)::float(8),
zr.route_type::numeric , stop_code=(select stop_code from z_stops where stop_id=paradero.id_paradero::text limit 1)
zr.route_url, where id_paradero::text in (select stop_id from z_stops );
zr.route_color ,
zr.route_text_color ,
zt.trip_headsign as route_long_name , true ,
(select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' limit 1) as id_red
from z_routes zr
inner join z_trips zt
on zr.route_id =zt.route_id
and replace (zt.trip_headsign,' ','') =replace ((SPLIT_PART(route_long_name, '-', 1)||'-'||SPLIT_PART(route_long_name, '-', 2)),' ','')
where route_long_name not like '%'||route_short_name ||'%'
and (trim(zr.route_id)||'-'||trim(zt.direction_id::varchar) ) not in (select id_linea from linea )
union
select distinct
trim(zr.route_id)||'-'||trim(zt.direction_id::varchar) as route_id,
null,--zr.agency_id ,
substring(zt.trip_headsign FROM '(\S+) -') as route_short_name ,
zr.route_desc ,
zr.route_type::numeric ,
zr.route_url,
zr.route_color ,
zr.route_text_color ,
zt.trip_headsign as route_long_name , true ,
(select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' limit 1) as id_red
from z_routes zr
inner join z_trips zt
on zr.route_id =zt.route_id
and replace (zt.trip_headsign,' ','') =replace ((SPLIT_PART(route_long_name, '-', 3)||'-'||SPLIT_PART(route_long_name, '-', 4)),' ','')
where route_long_name not like '%'||route_short_name ||'%'
and (trim(zr.route_id)||'-'||trim(zt.direction_id::varchar) ) not in (select id_linea from linea )
union
select distinct
trim(zr.route_id)||'-'||trim(zt.direction_id::varchar) as route_id,
null,--zr.agency_id ,
route_short_name ,
zr.route_desc ,
zr.route_type::numeric ,
zr.route_url,
zr.route_color ,
zr.route_text_color ,
zt.trip_headsign as route_long_name , true ,
(select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' limit 1) as id_red
from z_routes zr
inner join z_trips zt
on zr.route_id =zt.route_id
and
( position('-' in zt.trip_headsign) = 0
or
route_long_name like '%'||route_short_name ||'%'
)
where (trim(zr.route_id)||'-'||trim(zt.direction_id::varchar) ) not in (select id_linea from linea )
order by 1;
----- -----
truncate table gtfs_shape; insert into paradero
select
stop_id, null as id_comuna, null as id_tipo_paradero, true,
stop_code , stop_name , stop_desc , stop_lat::float(8) , stop_lon::float(8) , zone_id ,
stop_url , location_type ,
parent_station ,null as stop_time_zone , wheelchair_boarding::numeric
from z_stops zs
where stop_id not in (select id_paradero::text from paradero);
----- -----
insert into gtfs_shape delete from linea_paradero;
select shape_id::numeric,shape_pt_lat::float8,shape_pt_lon::float8,
shape_pt_sequence::numeric,shape_dist_traveled::float8
from z_shapes zs;
----- -----
truncate table gtfs_stop_times;
-----
truncate table gtfs_frequencie; CREATE TABLE IF NOT EXISTS z_verifica_route (
route_id text NULL,
route_short_name text NULL
);
-----
truncate table gtfs_trips; delete from linea l
where id_linea in
(
select route_id||'-0' from z_verifica_route as v
where coalesce((select count(*) from z_routes as r where r.route_id=v.route_id and r.route_short_name = v.route_short_name),0)=0
union
select route_id||'-1' from z_verifica_route as v
where coalesce((select count(*) from z_routes as r where r.route_id=v.route_id and r.route_short_name = v.route_short_name),0)=0
union
select route_id from z_verifica_route as v
where coalesce((select count(*) from z_routes as r where r.route_id=v.route_id and r.route_short_name = v.route_short_name),0)=0
) ;
----- delete from z_verifica_route ;
insert into gtfs_trips insert into z_verifica_route
select select route_id, route_short_name from z_routes ;
trip_id,
trim(route_id)||'-'||trim(direction_id::varchar) as route_id,
shape_id::numeric ,null as regreso, trip_headsign,trip_short_name,direction_id::numeric,service_id::varchar,block_id
from z_trips zt;
----- -----
insert into gtfs_stop_times update linea
select stop_id,trip_id,arrival_time,stop_sequence::numeric,stop_headsign,departure_time,drop_off_type::numeric,null as shape_dist_traveled , set vigente = false
timepoint::numeric , pickup_type::numeric where id_red in (select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' )
from z_stop_times zst ; and id_linea not in (
select trim(zr.route_id)||'-'||trim(zt.direction_id::varchar)
from z_routes zr
inner join z_trips zt on zr.route_id =zt.route_id
);
----- -----
insert into linea_paradero (id_linea , id_paradero )
SELECT DISTINCT
l.id_linea , p.id_paradero
FROM linea l
JOIN gtfs_trips t ON l.id_linea =t.id_linea
JOIN gtfs_stop_times st ON t.id_trip = st.id_trip
JOIN paradero p ON st.id_paradero = p.id_paradero;
-----
UPDATE paradero update linea
SET stop_name = REGEXP_REPLACE( set vigente = true
REGEXP_REPLACE( where id_red in (select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' )
stop_name, and id_linea in (
'\yentre\y', select trim(zr.route_id)||'-'||trim(zt.direction_id::varchar)
'-entre', from z_routes zr
'gi' inner join z_trips zt on zr.route_id =zt.route_id
), );
'\yesq\y',
'-esq',
'gi'
);
----- -----
update paradero
set id_comuna = (select id_comuna from comuna_georeferencia as c where ST_Contains(c.geom, ST_SetSRID(ST_MakePoint(paradero.stop_lon, paradero.stop_lat), 4326)) limit 1)
where id_comuna is not null;
-----
insert into dispositivo insert into linea
select 'QRCode-'||id_paradero , id_paradero , true, null, 3 select distinct
from paradero as p where id_paradero trim(zr.route_id)||'-'||trim(zt.direction_id::varchar) as route_id,
not in (select id_paradero from dispositivo as d where id_tipo_dispositivo=3 and d.id_paradero = p.id_paradero); null,--zr.agency_id ,
substring(zt.trip_headsign FROM '(\S+) -') as route_short_name ,
zr.route_desc ,
zr.route_type::numeric ,
zr.route_url,
zr.route_color ,
zr.route_text_color ,
zt.trip_headsign as route_long_name , true ,
(select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' limit 1) as id_red
from z_routes zr
inner join z_trips zt
on zr.route_id =zt.route_id
and replace (zt.trip_headsign,' ','') =replace ((SPLIT_PART(route_long_name, '-', 1)||'-'||SPLIT_PART(route_long_name, '-', 2)),' ','')
where route_long_name not like '%'||route_short_name ||'%'
and (trim(zr.route_id)||'-'||trim(zt.direction_id::varchar) ) not in (select id_linea from linea )
union
select distinct
trim(zr.route_id)||'-'||trim(zt.direction_id::varchar) as route_id,
null,--zr.agency_id ,
substring(zt.trip_headsign FROM '(\S+) -') as route_short_name ,
zr.route_desc ,
zr.route_type::numeric ,
zr.route_url,
zr.route_color ,
zr.route_text_color ,
zt.trip_headsign as route_long_name , true ,
(select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' limit 1) as id_red
from z_routes zr
inner join z_trips zt
on zr.route_id =zt.route_id
and replace (zt.trip_headsign,' ','') =replace ((SPLIT_PART(route_long_name, '-', 3)||'-'||SPLIT_PART(route_long_name, '-', 4)),' ','')
where route_long_name not like '%'||route_short_name ||'%'
and (trim(zr.route_id)||'-'||trim(zt.direction_id::varchar) ) not in (select id_linea from linea )
union
select distinct
trim(zr.route_id)||'-'||trim(zt.direction_id::varchar) as route_id,
null,--zr.agency_id ,
route_short_name ,
zr.route_desc ,
zr.route_type::numeric ,
zr.route_url,
zr.route_color ,
zr.route_text_color ,
zt.trip_headsign as route_long_name , true ,
(select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' limit 1) as id_red
from z_routes zr
inner join z_trips zt
on zr.route_id =zt.route_id
and
( position('-' in zt.trip_headsign) = 0
or
route_long_name like '%'||route_short_name ||'%'
)
where (trim(zr.route_id)||'-'||trim(zt.direction_id::varchar) ) not in (select id_linea from linea )
order by 1;
----- -----
ALTER TABLE linea_paradero ADD CONSTRAINT linea_paradero_id_linea_fkey FOREIGN KEY (id_linea) REFERENCES linea(id_linea); truncate table gtfs_shape;
----- -----
ALTER TABLE gtfs_stop_times ADD CONSTRAINT fk_gtfs_sto_reference_gtfs_tri FOREIGN KEY (id_trip) REFERENCES gtfs_trips(id_trip) ON DELETE RESTRICT ON UPDATE RESTRICT; insert into gtfs_shape
select shape_id::numeric,shape_pt_lat::float8,shape_pt_lon::float8,
shape_pt_sequence::numeric,shape_dist_traveled::float8
from z_shapes zs;
----- -----
truncate table gtfs_stop_times;
ALTER TABLE gtfs_frequencie ADD CONSTRAINT fk_gtfs_fre_reference_gtfs_tri FOREIGN KEY (id_trip) REFERENCES gtfs_trips(id_trip) ON DELETE RESTRICT ON UPDATE RESTRICT; -----
----- truncate table gtfs_frequencie;
-----
truncate table gtfs_trips;
-----
insert into gtfs_trips
select
trip_id,
trim(route_id)||'-'||trim(direction_id::varchar) as route_id,
shape_id::numeric ,null as regreso, trip_headsign,trip_short_name,direction_id::numeric,service_id::varchar,block_id
from z_trips zt;
-----
insert into gtfs_stop_times
select stop_id,trip_id,arrival_time,stop_sequence::numeric,stop_headsign,departure_time,drop_off_type::numeric,null as shape_dist_traveled ,
timepoint::numeric , pickup_type::numeric
from z_stop_times zst ;
-----
insert into linea_paradero (id_linea , id_paradero )
SELECT DISTINCT
l.id_linea , p.id_paradero
FROM linea l
JOIN gtfs_trips t ON l.id_linea =t.id_linea
JOIN gtfs_stop_times st ON t.id_trip = st.id_trip
JOIN paradero p ON st.id_paradero = p.id_paradero;
-----
UPDATE paradero
SET stop_name = REGEXP_REPLACE(
REGEXP_REPLACE(
stop_name,
'\yentre\y',
'-entre',
'gi'
),
'\yesq\y',
'-esq',
'gi'
);
-----
update paradero
set id_comuna = (select id_comuna from comuna_georeferencia as c where ST_Contains(c.geom, ST_SetSRID(ST_MakePoint(paradero.stop_lon, paradero.stop_lat), 4326)) limit 1)
where id_comuna is not null;
-----
insert into dispositivo
select 'QRCode-'||id_paradero , id_paradero , true, null, 3
from paradero as p where id_paradero
not in (select id_paradero from dispositivo as d where id_tipo_dispositivo=3 and d.id_paradero = p.id_paradero);
-----
ALTER TABLE linea_paradero ADD CONSTRAINT linea_paradero_id_linea_fkey FOREIGN KEY (id_linea) REFERENCES linea(id_linea);
-----
ALTER TABLE gtfs_stop_times ADD CONSTRAINT fk_gtfs_sto_reference_gtfs_tri FOREIGN KEY (id_trip) REFERENCES gtfs_trips(id_trip) ON DELETE RESTRICT ON UPDATE RESTRICT;
-----
ALTER TABLE gtfs_frequencie ADD CONSTRAINT fk_gtfs_fre_reference_gtfs_tri FOREIGN KEY (id_trip) REFERENCES gtfs_trips(id_trip) ON DELETE RESTRICT ON UPDATE RESTRICT;
-----
update paradero p set id_comuna = (
select id_comuna from comuna_georeferencia cg
where st_contains(cg.geom, st_setsrid(st_makepoint(p.stop_lon, p.stop_lat) ,4326))
limit 1)
where id_comuna is null;
update gtfs_archivo
set vigente = true , status = 'GTFS CARGADO'
where trim(upper(status))='PROCESANDO' ;
END IF;
END$$;

View File

@ -0,0 +1,252 @@
ALTER TABLE linea_paradero drop CONSTRAINT IF EXISTS linea_paradero_id_linea_fkey;
-----
ALTER TABLE gtfs_stop_times drop CONSTRAINT IF EXISTS fk_gtfs_sto_reference_gtfs_tri;
-----
ALTER TABLE gtfs_frequencie drop CONSTRAINT IF EXISTS fk_gtfs_fre_reference_gtfs_tri;
-----
DELETE FROM gtfs_calendar;
-----
insert into gtfs_calendar
select service_id, monday::bool , tuesday::bool , wednesday::bool , thursday::bool ,friday::bool ,saturday::bool ,sunday::bool
from z_calendar zc;
-----
update paradero
set vigente = true,
stop_name= (select stop_name from z_stops where stop_id=paradero.id_paradero::text limit 1 ),
stop_desc=(select stop_desc from z_stops where stop_id=paradero.id_paradero::text limit 1 ),
stop_lat =(select stop_lat from z_stops where stop_id=paradero.id_paradero::text limit 1)::float(8),
stop_lon =(select stop_lon from z_stops where stop_id=paradero.id_paradero::text limit 1)::float(8),
stop_code=(select stop_code from z_stops where stop_id=paradero.id_paradero::text limit 1)
where id_paradero::text in (select stop_id from z_stops );
-----
insert into paradero
select
stop_id, null as id_comuna, null as id_tipo_paradero, true,
stop_code , stop_name , stop_desc , stop_lat::float(8) , stop_lon::float(8) , zone_id ,
stop_url , location_type ,
parent_station ,null as stop_time_zone , wheelchair_boarding::numeric
from z_stops zs
where stop_id not in (select id_paradero::text from paradero);
-----
delete from linea_paradero;
-----
CREATE TABLE IF NOT EXISTS z_verifica_route (
route_id text NULL,
route_short_name text NULL
);
delete from linea l
where id_linea in
(
select route_id||'-0' from z_verifica_route as v
where coalesce((select count(*) from z_routes as r where r.route_id=v.route_id and r.route_short_name = v.route_short_name),0)=0
union
select route_id||'-1' from z_verifica_route as v
where coalesce((select count(*) from z_routes as r where r.route_id=v.route_id and r.route_short_name = v.route_short_name),0)=0
union
select route_id from z_verifica_route as v
where coalesce((select count(*) from z_routes as r where r.route_id=v.route_id and r.route_short_name = v.route_short_name),0)=0
) ;
delete from z_verifica_route ;
insert into z_verifica_route
select route_id, route_short_name from z_routes ;
-----
update linea
set vigente = false
where id_red in (select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' )
and id_linea not in (
select trim(zr.route_id)||'-'||trim(zt.direction_id::varchar)
from z_routes zr
inner join z_trips zt on zr.route_id =zt.route_id
);
-----
update linea
set vigente = true
where id_red in (select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' )
and id_linea in (
select trim(zr.route_id)||'-'||trim(zt.direction_id::varchar)
from z_routes zr
inner join z_trips zt on zr.route_id =zt.route_id
);
-----
insert into linea
select distinct
trim(zr.route_id)||'-'||trim(zt.direction_id::varchar) as route_id,
null,--zr.agency_id ,
substring(zt.trip_headsign FROM '(\S+) -') as route_short_name ,
zr.route_desc ,
zr.route_type::numeric ,
zr.route_url,
zr.route_color ,
zr.route_text_color ,
zt.trip_headsign as route_long_name , true ,
(select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' limit 1) as id_red
from z_routes zr
inner join z_trips zt
on zr.route_id =zt.route_id
and replace (zt.trip_headsign,' ','') =replace ((SPLIT_PART(route_long_name, '-', 1)||'-'||SPLIT_PART(route_long_name, '-', 2)),' ','')
where route_long_name not like '%'||route_short_name ||'%'
and (trim(zr.route_id)||'-'||trim(zt.direction_id::varchar) ) not in (select id_linea from linea )
union
select distinct
trim(zr.route_id)||'-'||trim(zt.direction_id::varchar) as route_id,
null,--zr.agency_id ,
substring(zt.trip_headsign FROM '(\S+) -') as route_short_name ,
zr.route_desc ,
zr.route_type::numeric ,
zr.route_url,
zr.route_color ,
zr.route_text_color ,
zt.trip_headsign as route_long_name , true ,
(select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' limit 1) as id_red
from z_routes zr
inner join z_trips zt
on zr.route_id =zt.route_id
and replace (zt.trip_headsign,' ','') =replace ((SPLIT_PART(route_long_name, '-', 3)||'-'||SPLIT_PART(route_long_name, '-', 4)),' ','')
where route_long_name not like '%'||route_short_name ||'%'
and (trim(zr.route_id)||'-'||trim(zt.direction_id::varchar) ) not in (select id_linea from linea )
union
select distinct
trim(zr.route_id)||'-'||trim(zt.direction_id::varchar) as route_id,
null,--zr.agency_id ,
route_short_name ,
zr.route_desc ,
zr.route_type::numeric ,
zr.route_url,
zr.route_color ,
zr.route_text_color ,
zt.trip_headsign as route_long_name , true ,
(select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' limit 1) as id_red
from z_routes zr
inner join z_trips zt
on zr.route_id =zt.route_id
and
( position('-' in zt.trip_headsign) = 0
or
route_long_name like '%'||route_short_name ||'%'
)
where (trim(zr.route_id)||'-'||trim(zt.direction_id::varchar) ) not in (select id_linea from linea )
order by 1;
-----
truncate table gtfs_shape;
-----
insert into gtfs_shape
select shape_id::numeric,shape_pt_lat::float8,shape_pt_lon::float8,
shape_pt_sequence::numeric,shape_dist_traveled::float8
from z_shapes zs;
-----
truncate table gtfs_stop_times;
-----
truncate table gtfs_frequencie;
-----
truncate table gtfs_trips;
-----
insert into gtfs_trips
select
trip_id,
trim(route_id)||'-'||trim(direction_id::varchar) as route_id,
shape_id::numeric ,null as regreso, trip_headsign,trip_short_name,direction_id::numeric,service_id::varchar,block_id
from z_trips zt;
-----
insert into gtfs_stop_times
select stop_id,trip_id,arrival_time,stop_sequence::numeric,stop_headsign,departure_time,drop_off_type::numeric,null as shape_dist_traveled ,
timepoint::numeric , pickup_type::numeric
from z_stop_times zst ;
-----
insert into linea_paradero (id_linea , id_paradero )
SELECT DISTINCT
l.id_linea , p.id_paradero
FROM linea l
JOIN gtfs_trips t ON l.id_linea =t.id_linea
JOIN gtfs_stop_times st ON t.id_trip = st.id_trip
JOIN paradero p ON st.id_paradero = p.id_paradero;
-----
UPDATE paradero
SET stop_name = REGEXP_REPLACE(
REGEXP_REPLACE(
stop_name,
'\yentre\y',
'-entre',
'gi'
),
'\yesq\y',
'-esq',
'gi'
);
-----
update paradero
set id_comuna = (select id_comuna from comuna_georeferencia as c where ST_Contains(c.geom, ST_SetSRID(ST_MakePoint(paradero.stop_lon, paradero.stop_lat), 4326)) limit 1)
where id_comuna is not null;
-----
insert into dispositivo
select 'QRCode-'||id_paradero , id_paradero , true, null, 3
from paradero as p where id_paradero
not in (select id_paradero from dispositivo as d where id_tipo_dispositivo=3 and d.id_paradero = p.id_paradero);
-----
ALTER TABLE linea_paradero ADD CONSTRAINT linea_paradero_id_linea_fkey FOREIGN KEY (id_linea) REFERENCES linea(id_linea);
-----
ALTER TABLE gtfs_stop_times ADD CONSTRAINT fk_gtfs_sto_reference_gtfs_tri FOREIGN KEY (id_trip) REFERENCES gtfs_trips(id_trip) ON DELETE RESTRICT ON UPDATE RESTRICT;
-----
ALTER TABLE gtfs_frequencie ADD CONSTRAINT fk_gtfs_fre_reference_gtfs_tri FOREIGN KEY (id_trip) REFERENCES gtfs_trips(id_trip) ON DELETE RESTRICT ON UPDATE RESTRICT;
-----
update paradero p set id_comuna = (
select id_comuna from comuna_georeferencia cg
where st_contains(cg.geom, st_setsrid(st_makepoint(p.stop_lon, p.stop_lat) ,4326))
limit 1)
where id_comuna is null;

View File

@ -33,14 +33,14 @@ class Command(BaseCommand):
print(f'procesa: {filepath}') print(f'procesa: {filepath}')
procesa_zip(filepath) procesa_zip(filepath)
registro_anterior = GtfsArchivo.objects.filter(vigente=True, id_red = red.id_red).first() #registro_anterior = GtfsArchivo.objects.filter(vigente=True, id_red = red.id_red).first()
if registro_anterior: #if registro_anterior:
registro_anterior.vigente = False # registro_anterior.vigente = False
registro_anterior.save() # registro_anterior.save()
gtfs_archivo.status = 'GTFS CARGADO' #gtfs_archivo.status = 'GTFS CARGADO'
gtfs_archivo.vigente = True #gtfs_archivo.vigente = True
gtfs_archivo.save() #gtfs_archivo.save()
self.stdout.write(self.style.SUCCESS('¡Comando ejecutado con éxito!')) self.stdout.write(self.style.SUCCESS('¡Comando ejecutado con éxito!'))
@ -129,7 +129,10 @@ def procesa_tablas_z(cursor):
current_folder = os.path.dirname(os.path.abspath(__file__)) current_folder = os.path.dirname(os.path.abspath(__file__))
with open(os.path.join(current_folder, 'actualiza_GTFS.sql'),'r') as file: with open(os.path.join(current_folder, 'actualiza_GTFS.sql'),'r') as file:
content = ''.join(file.readlines()) sqlFile = file.read()
cursor.execute(sqlFile)
cursor.commit()
""" content = ''.join(file.readlines())
arr_sql = content.split('-----') arr_sql = content.split('-----')
for sql in arr_sql: for sql in arr_sql:
@ -137,4 +140,4 @@ def procesa_tablas_z(cursor):
if sql > ' ': if sql > ' ':
print(f'SQL> {sql}', flush=True) print(f'SQL> {sql}', flush=True)
cursor.execute(sql) cursor.execute(sql)
print('', flush=True) print('', flush=True) """

View File

@ -288,7 +288,7 @@ class Region(models.Model):
class RolAplicacion(models.Model): class RolAplicacion(models.Model):
id_rol_app = models.AutoField(primary_key=True) id_rol_app = models.AutoField(primary_key=True)
id_aplicacion = models.ForeignKey(Aplicacion, models.DO_NOTHING, db_column='id_aplicacion', blank=False, null=False) id_aplicacion = models.ForeignKey(Aplicacion, models.DO_NOTHING, db_column='id_aplicacion', blank=False, null=False)
id_rol = models.ForeignKey(Rol, models.DO_NOTHING, db_column='id_rol', blank=False, null=False) id_rol = models.ForeignKey(Rol, on_delete=models.CASCADE, db_column='id_rol', blank=False, null=False)
solo_visualizar = models.BooleanField(blank=True, null=True) solo_visualizar = models.BooleanField(blank=True, null=True)
class Meta: class Meta:
@ -298,8 +298,9 @@ class RolAplicacion(models.Model):
class RolOperador(models.Model): class RolOperador(models.Model):
id_rol_operador = models.AutoField(primary_key=True) id_rol_operador = models.AutoField(primary_key=True)
id_rol = models.ForeignKey(Rol, models.DO_NOTHING, db_column='id_rol') id_rol = models.ForeignKey(Rol, models.DO_NOTHING, db_column='id_rol')
id_operador = models.ForeignKey(Operador, models.DO_NOTHING, db_column='id_operador') id_operador = models.ForeignKey(Operador, on_delete=models.CASCADE, db_column='id_operador')
class Meta: class Meta:
managed = True managed = True

View File

@ -41,5 +41,5 @@ urlpatterns = [
path('auth/nueva-contrasena/', auth.nueva_contrasena, name='auth_contrasena'), path('auth/nueva-contrasena/', auth.nueva_contrasena, name='auth_contrasena'),
path('mapas/paraderos/', mapa.paraderos, name='mapa-paraderos'), path('mapas/paraderos/', mapa.paraderos, name='mapa-paraderos'),
path('mapas/rutas/', mapa.rutas, name='mapa-rutas'), path('mapas/rutas/', mapa.rutas, name='mapa-rutas'),
path('upload/zip/', upload.upload_zip, name='upload_zip'), path('upload/zip/', upload.upload_zip, name='upload_zip'),
] ]

View File

@ -105,6 +105,7 @@ class DispositivoViewSet(viewsets.ModelViewSet):
if id_linea == linea.id_linea: if id_linea == linea.id_linea:
hora_llegada = trayecto['hora_llegada'] hora_llegada = trayecto['hora_llegada']
distancia_km = None distancia_km = None
texto_llegada= None
# si no trae latitud ni longitud: buscar en trayectos_none por patente # si no trae latitud ni longitud: buscar en trayectos_none por patente
# y sobreescribir latitud y longitud # y sobreescribir latitud y longitud
@ -122,18 +123,19 @@ class DispositivoViewSet(viewsets.ModelViewSet):
p_lon = trayecto['longitude'] p_lon = trayecto['longitude']
p_lat = trayecto['latitude'] p_lat = trayecto['latitude']
sql = "select hora_llegada, distancia_km from fn_gtfs_calcula_distancia_tiempo_llegada(%s,%s,%s,%s,%s)" sql = "select hora_llegada, distancia_km, texto_llegada from fn_gtfs_calcula_distancia_tiempo_llegada(%s,%s,%s,%s,%s)"
cursor.execute(sql, [trip_id, stop_id, velocidad_promedio, p_lon, p_lat]) cursor.execute(sql, [trip_id, stop_id, velocidad_promedio, p_lon, p_lat])
row = cursor.fetchone() row = cursor.fetchone()
if patente == 'FDCB32': """ if patente == 'FDCB32':
print(f'SQL: {sql}', flush=True) print(f'SQL: {sql}', flush=True)
print(f'params: {[trip_id, stop_id, velocidad_promedio, p_lon, p_lat]}', flush=True) print(f'params: {[trip_id, stop_id, velocidad_promedio, p_lon, p_lat]}', flush=True)
print(f'row: {row}', flush=True) print(f'row: {row}', flush=True) """
if row != None: if row != None:
hora_llegada = row[0].strftime('%H:%M:%S') hora_llegada = row[0].strftime('%H:%M:%S')
distancia_km = row[1] distancia_km = row[1]
texto_llegada= row[2]
llegadas.append({ llegadas.append({
'patente': trayecto['vehicle_license_plate'], 'patente': trayecto['vehicle_license_plate'],
@ -143,6 +145,7 @@ class DispositivoViewSet(viewsets.ModelViewSet):
'stop_id_alterno': trayecto['stop_id_alterno'], 'stop_id_alterno': trayecto['stop_id_alterno'],
'EstimadaGPS': hora_llegada, 'EstimadaGPS': hora_llegada,
'DistanciaGPS': distancia_km, 'DistanciaGPS': distancia_km,
'textoLlegada' : texto_llegada,
'Mensajelinea': None, 'Mensajelinea': None,
}) })

View File

@ -5,6 +5,7 @@ from api.serializers import ParaderoSerializer
from api.models import Paradero, Dispositivo from api.models import Paradero, Dispositivo
from decouple import config from decouple import config
import logging import logging
from django.db.models import Count
class ParaderoViewSet(viewsets.ModelViewSet): class ParaderoViewSet(viewsets.ModelViewSet):
queryset = Paradero.objects.all() queryset = Paradero.objects.all()
@ -25,7 +26,17 @@ class ParaderoViewSet(viewsets.ModelViewSet):
pass pass
return JsonResponse({ 'count': queryset.count() }) return JsonResponse({ 'count': queryset.count() })
@action(detail=False, methods=['get'], url_path='count_by_comuna')
def count_by_comuna(self, request, pk=None):
# Solo paraderos vigentes
queryset = Paradero.objects.filter(vigente=True)
# Conteo agrupado por comuna
count_by_comuna = queryset.values('id_comuna__nombre_comuna').annotate(total=Count('id_paradero')).order_by('id_comuna')
return JsonResponse({'count_by_comuna': list(count_by_comuna)})
@action(detail=False, methods=['get'], url_path='info-public/(?P<pk>\S+)') @action(detail=False, methods=['get'], url_path='info-public/(?P<pk>\S+)')
def info_public(self, request, pk=None): def info_public(self, request, pk=None):
if 'HTTP_REFERER' in request.META: if 'HTTP_REFERER' in request.META: