23: ) is
24:
25: cursor c_child_delivery_leg (c_parent_delivery_leg_id NUMBER) is
26: select delivery_leg_id, delivery_id from
27: wsh_Delivery_legs where parent_delivery_leg_id = c_parent_delivery_leg_id;
28:
29:
30: l_transaction_id_s number ;
31: l_activity_id_s number;
58: l_procedure_name VARCHAR2(240) := 'FTE_TRACKING_WRAPPER.populate_child_delivery_legs';
59:
60: cursor get_org_delivery_info ( c_delivery_leg_id NUMBER) IS
61: SELECT wnd.delivery_id, wnd.organization_id FROM
62: wsh_delivery_legs wdl, wsh_new_deliveries wnd
63: WHERE wdl.delivery_id = wnd.delivery_id AND
64: wdl.delivery_leg_id = c_delivery_leg_id;
65:
66: BEGIN
941: l_return_statuswf VARCHAR2(1);
942:
943: cursor get_org_delivery_info ( c_delivery_leg_id NUMBER) IS
944: SELECT wnd.delivery_id, wnd.organization_id FROM
945: wsh_delivery_legs wdl, wsh_new_deliveries wnd
946: WHERE wdl.delivery_id = wnd.delivery_id AND
947: wdl.delivery_leg_id = c_delivery_leg_id;
948:
949:
996: IF (UPPER(l_tracking_id_type) = 'WAYBILL') THEN
997:
998:
999: SELECT /*+ first_rows ordered */
1000: wsh_delivery_legs.delivery_id, wsh_trips.carrier_id, wsh_new_deliveries.waybill,
1001: wsh_delivery_legs.delivery_leg_id
1002: INTO l_delivery_id, l_carrier_id, l_waybill, l_delivery_leg_id
1003: FROM wsh_trips, wsh_trip_stops, wsh_delivery_legs , wsh_new_deliveries
1004: WHERE wsh_delivery_legs.delivery_id = wsh_new_deliveries.delivery_id
997:
998:
999: SELECT /*+ first_rows ordered */
1000: wsh_delivery_legs.delivery_id, wsh_trips.carrier_id, wsh_new_deliveries.waybill,
1001: wsh_delivery_legs.delivery_leg_id
1002: INTO l_delivery_id, l_carrier_id, l_waybill, l_delivery_leg_id
1003: FROM wsh_trips, wsh_trip_stops, wsh_delivery_legs , wsh_new_deliveries
1004: WHERE wsh_delivery_legs.delivery_id = wsh_new_deliveries.delivery_id
1005: AND wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
999: SELECT /*+ first_rows ordered */
1000: wsh_delivery_legs.delivery_id, wsh_trips.carrier_id, wsh_new_deliveries.waybill,
1001: wsh_delivery_legs.delivery_leg_id
1002: INTO l_delivery_id, l_carrier_id, l_waybill, l_delivery_leg_id
1003: FROM wsh_trips, wsh_trip_stops, wsh_delivery_legs , wsh_new_deliveries
1004: WHERE wsh_delivery_legs.delivery_id = wsh_new_deliveries.delivery_id
1005: AND wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
1006: AND wsh_trip_stops.trip_id = wsh_trips.trip_id
1007: AND wsh_trips.carrier_id = l_carrier_id
1000: wsh_delivery_legs.delivery_id, wsh_trips.carrier_id, wsh_new_deliveries.waybill,
1001: wsh_delivery_legs.delivery_leg_id
1002: INTO l_delivery_id, l_carrier_id, l_waybill, l_delivery_leg_id
1003: FROM wsh_trips, wsh_trip_stops, wsh_delivery_legs , wsh_new_deliveries
1004: WHERE wsh_delivery_legs.delivery_id = wsh_new_deliveries.delivery_id
1005: AND wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
1006: AND wsh_trip_stops.trip_id = wsh_trips.trip_id
1007: AND wsh_trips.carrier_id = l_carrier_id
1008: AND wsh_new_deliveries.waybill = l_tracking_id
1001: wsh_delivery_legs.delivery_leg_id
1002: INTO l_delivery_id, l_carrier_id, l_waybill, l_delivery_leg_id
1003: FROM wsh_trips, wsh_trip_stops, wsh_delivery_legs , wsh_new_deliveries
1004: WHERE wsh_delivery_legs.delivery_id = wsh_new_deliveries.delivery_id
1005: AND wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
1006: AND wsh_trip_stops.trip_id = wsh_trips.trip_id
1007: AND wsh_trips.carrier_id = l_carrier_id
1008: AND wsh_new_deliveries.waybill = l_tracking_id
1009: AND wsh_delivery_legs.parent_delivery_leg_id is null;--Rel 12 MDC Changes
1005: AND wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
1006: AND wsh_trip_stops.trip_id = wsh_trips.trip_id
1007: AND wsh_trips.carrier_id = l_carrier_id
1008: AND wsh_new_deliveries.waybill = l_tracking_id
1009: AND wsh_delivery_legs.parent_delivery_leg_id is null;--Rel 12 MDC Changes
1010:
1011:
1012:
1013: INSERT INTO wsh_delivery_leg_activities
1089:
1090: ELSIF (upper(l_tracking_id_type) = 'BOOKING NUMBER')
1091: THEN
1092: SELECT /*+ first_rows ordered */
1093: wsh_delivery_legs.delivery_id, wsh_trips.carrier_id,
1094: wsh_delivery_legs.booking_number, wsh_delivery_legs.delivery_leg_id
1095: INTO l_delivery_id, l_carrier_id, l_booking_number, l_delivery_leg_id
1096: FROM wsh_trips, wsh_trip_stops, wsh_delivery_legs , wsh_new_deliveries
1097: WHERE wsh_delivery_legs.delivery_id = wsh_new_deliveries.delivery_id
1090: ELSIF (upper(l_tracking_id_type) = 'BOOKING NUMBER')
1091: THEN
1092: SELECT /*+ first_rows ordered */
1093: wsh_delivery_legs.delivery_id, wsh_trips.carrier_id,
1094: wsh_delivery_legs.booking_number, wsh_delivery_legs.delivery_leg_id
1095: INTO l_delivery_id, l_carrier_id, l_booking_number, l_delivery_leg_id
1096: FROM wsh_trips, wsh_trip_stops, wsh_delivery_legs , wsh_new_deliveries
1097: WHERE wsh_delivery_legs.delivery_id = wsh_new_deliveries.delivery_id
1098: AND wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
1092: SELECT /*+ first_rows ordered */
1093: wsh_delivery_legs.delivery_id, wsh_trips.carrier_id,
1094: wsh_delivery_legs.booking_number, wsh_delivery_legs.delivery_leg_id
1095: INTO l_delivery_id, l_carrier_id, l_booking_number, l_delivery_leg_id
1096: FROM wsh_trips, wsh_trip_stops, wsh_delivery_legs , wsh_new_deliveries
1097: WHERE wsh_delivery_legs.delivery_id = wsh_new_deliveries.delivery_id
1098: AND wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
1099: AND wsh_trip_stops.trip_id = wsh_trips.trip_id
1100: AND wsh_trips.carrier_id = l_carrier_id
1093: wsh_delivery_legs.delivery_id, wsh_trips.carrier_id,
1094: wsh_delivery_legs.booking_number, wsh_delivery_legs.delivery_leg_id
1095: INTO l_delivery_id, l_carrier_id, l_booking_number, l_delivery_leg_id
1096: FROM wsh_trips, wsh_trip_stops, wsh_delivery_legs , wsh_new_deliveries
1097: WHERE wsh_delivery_legs.delivery_id = wsh_new_deliveries.delivery_id
1098: AND wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
1099: AND wsh_trip_stops.trip_id = wsh_trips.trip_id
1100: AND wsh_trips.carrier_id = l_carrier_id
1101: AND wsh_delivery_legs.booking_number = l_tracking_id
1094: wsh_delivery_legs.booking_number, wsh_delivery_legs.delivery_leg_id
1095: INTO l_delivery_id, l_carrier_id, l_booking_number, l_delivery_leg_id
1096: FROM wsh_trips, wsh_trip_stops, wsh_delivery_legs , wsh_new_deliveries
1097: WHERE wsh_delivery_legs.delivery_id = wsh_new_deliveries.delivery_id
1098: AND wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
1099: AND wsh_trip_stops.trip_id = wsh_trips.trip_id
1100: AND wsh_trips.carrier_id = l_carrier_id
1101: AND wsh_delivery_legs.booking_number = l_tracking_id
1102: AND wsh_delivery_legs.parent_delivery_leg_id is null;--Rel 12 MDC Changes
1097: WHERE wsh_delivery_legs.delivery_id = wsh_new_deliveries.delivery_id
1098: AND wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
1099: AND wsh_trip_stops.trip_id = wsh_trips.trip_id
1100: AND wsh_trips.carrier_id = l_carrier_id
1101: AND wsh_delivery_legs.booking_number = l_tracking_id
1102: AND wsh_delivery_legs.parent_delivery_leg_id is null;--Rel 12 MDC Changes
1103:
1104:
1105:
1098: AND wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
1099: AND wsh_trip_stops.trip_id = wsh_trips.trip_id
1100: AND wsh_trips.carrier_id = l_carrier_id
1101: AND wsh_delivery_legs.booking_number = l_tracking_id
1102: AND wsh_delivery_legs.parent_delivery_leg_id is null;--Rel 12 MDC Changes
1103:
1104:
1105:
1106: insert into wsh_delivery_leg_activities
1178:
1179:
1180: elsif (upper(l_tracking_id_type) = 'BILL OF LADING')
1181: then
1182: select wsh_new_deliveries.delivery_id, wsh_delivery_legs.delivery_leg_id,
1183: wsh_trips.carrier_id
1184: into l_delivery_id, l_delivery_leg_id, l_carrier_id
1185: from wsh_new_deliveries, wsh_bols_rd_v, wsh_delivery_legs, wsh_trips, wsh_trip_stops
1186: where wsh_bols_rd_v.delivery_leg_id = wsh_delivery_legs.delivery_leg_id
1181: then
1182: select wsh_new_deliveries.delivery_id, wsh_delivery_legs.delivery_leg_id,
1183: wsh_trips.carrier_id
1184: into l_delivery_id, l_delivery_leg_id, l_carrier_id
1185: from wsh_new_deliveries, wsh_bols_rd_v, wsh_delivery_legs, wsh_trips, wsh_trip_stops
1186: where wsh_bols_rd_v.delivery_leg_id = wsh_delivery_legs.delivery_leg_id
1187: and wsh_delivery_legs.delivery_id = wsh_new_deliveries.delivery_id
1188: and wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
1189: and wsh_trip_stops.trip_Id = wsh_trips.trip_id
1182: select wsh_new_deliveries.delivery_id, wsh_delivery_legs.delivery_leg_id,
1183: wsh_trips.carrier_id
1184: into l_delivery_id, l_delivery_leg_id, l_carrier_id
1185: from wsh_new_deliveries, wsh_bols_rd_v, wsh_delivery_legs, wsh_trips, wsh_trip_stops
1186: where wsh_bols_rd_v.delivery_leg_id = wsh_delivery_legs.delivery_leg_id
1187: and wsh_delivery_legs.delivery_id = wsh_new_deliveries.delivery_id
1188: and wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
1189: and wsh_trip_stops.trip_Id = wsh_trips.trip_id
1190: and wsh_trips.carrier_id = l_carrier_id
1183: wsh_trips.carrier_id
1184: into l_delivery_id, l_delivery_leg_id, l_carrier_id
1185: from wsh_new_deliveries, wsh_bols_rd_v, wsh_delivery_legs, wsh_trips, wsh_trip_stops
1186: where wsh_bols_rd_v.delivery_leg_id = wsh_delivery_legs.delivery_leg_id
1187: and wsh_delivery_legs.delivery_id = wsh_new_deliveries.delivery_id
1188: and wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
1189: and wsh_trip_stops.trip_Id = wsh_trips.trip_id
1190: and wsh_trips.carrier_id = l_carrier_id
1191: and wsh_bols_rd_v.bill_of_lading_number = l_tracking_id
1184: into l_delivery_id, l_delivery_leg_id, l_carrier_id
1185: from wsh_new_deliveries, wsh_bols_rd_v, wsh_delivery_legs, wsh_trips, wsh_trip_stops
1186: where wsh_bols_rd_v.delivery_leg_id = wsh_delivery_legs.delivery_leg_id
1187: and wsh_delivery_legs.delivery_id = wsh_new_deliveries.delivery_id
1188: and wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
1189: and wsh_trip_stops.trip_Id = wsh_trips.trip_id
1190: and wsh_trips.carrier_id = l_carrier_id
1191: and wsh_bols_rd_v.bill_of_lading_number = l_tracking_id
1192: and wsh_delivery_legs.parent_delivery_leg_id is null;--Rel 12 MDC Changes
1188: and wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
1189: and wsh_trip_stops.trip_Id = wsh_trips.trip_id
1190: and wsh_trips.carrier_id = l_carrier_id
1191: and wsh_bols_rd_v.bill_of_lading_number = l_tracking_id
1192: and wsh_delivery_legs.parent_delivery_leg_id is null;--Rel 12 MDC Changes
1193:
1194:
1195: insert into wsh_delivery_leg_activities
1196: (activity_id, delivery_leg_id, activity_date, activity_type,
1271: -- method will not be called.
1272:
1273: elsif (upper(l_tracking_id_type) = 'LICENSE PLATE NUMBER')
1274: then -- license plate number is only used by container
1275: select wsh_new_deliveries.delivery_id, wsh_delivery_legs.delivery_leg_id,
1276: wsh_trips.carrier_id, wsh_delivery_details.container_name,
1277: wsh_delivery_details.delivery_detail_id
1278: into l_delivery_id, l_delivery_leg_id, l_carrier_id, l_container_name,
1279: l_delivery_detail_id
1276: wsh_trips.carrier_id, wsh_delivery_details.container_name,
1277: wsh_delivery_details.delivery_detail_id
1278: into l_delivery_id, l_delivery_leg_id, l_carrier_id, l_container_name,
1279: l_delivery_detail_id
1280: from wsh_new_deliveries, wsh_delivery_legs, wsh_trips, wsh_trip_stops,
1281: wsh_delivery_details, wsh_delivery_assignments
1282: where wsh_delivery_assignments.DELIVERY_ID = wsh_new_deliveries.DELIVERY_ID
1283: and wsh_delivery_assignments.DELIVERY_DETAIL_ID =
1284: wsh_delivery_details.DELIVERY_DETAIL_ID
1281: wsh_delivery_details, wsh_delivery_assignments
1282: where wsh_delivery_assignments.DELIVERY_ID = wsh_new_deliveries.DELIVERY_ID
1283: and wsh_delivery_assignments.DELIVERY_DETAIL_ID =
1284: wsh_delivery_details.DELIVERY_DETAIL_ID
1285: and wsh_delivery_legs.delivery_id = wsh_new_deliveries.delivery_id
1286: and wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
1287: and wsh_trip_stops.trip_Id = wsh_trips.trip_id
1288: and wsh_trips.carrier_id = l_carrier_id
1289: and wsh_delivery_details.container_name = l_tracking_id
1282: where wsh_delivery_assignments.DELIVERY_ID = wsh_new_deliveries.DELIVERY_ID
1283: and wsh_delivery_assignments.DELIVERY_DETAIL_ID =
1284: wsh_delivery_details.DELIVERY_DETAIL_ID
1285: and wsh_delivery_legs.delivery_id = wsh_new_deliveries.delivery_id
1286: and wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
1287: and wsh_trip_stops.trip_Id = wsh_trips.trip_id
1288: and wsh_trips.carrier_id = l_carrier_id
1289: and wsh_delivery_details.container_name = l_tracking_id
1290: and wsh_delivery_legs.parent_delivery_leg_id is null;--Rel 12 MDC Changes
1286: and wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
1287: and wsh_trip_stops.trip_Id = wsh_trips.trip_id
1288: and wsh_trips.carrier_id = l_carrier_id
1289: and wsh_delivery_details.container_name = l_tracking_id
1290: and wsh_delivery_legs.parent_delivery_leg_id is null;--Rel 12 MDC Changes
1291:
1292:
1293:
1294: insert into wsh_delivery_leg_activities
1334:
1335: elsif (upper(l_tracking_id_type) = 'SEAL IDENTIFIER')
1336: then -- seal code is only used by container
1337:
1338: select /*+ORDERED INDEX(wdl WSH_DELIVERY_LEGS_N2)*/
1339: wnd.delivery_id,
1340: wdl.delivery_leg_id,
1341: wt.carrier_id,
1342: wdd.seal_code,
1345: l_delivery_detail_id
1346: from
1347: wsh_trips wt,
1348: wsh_trip_stops wts,
1349: wsh_delivery_legs wdl,
1350: wsh_new_deliveries wnd,
1351: wsh_delivery_assignments wda,
1352: wsh_delivery_details wdd
1353: where wda.DELIVERY_ID = wnd.DELIVERY_ID
1421: -- It is only in wsh_delivery_details level,
1422: -- not in wsh_new_deliveries level
1423:
1424:
1425: select wsh_new_deliveries.delivery_id, wsh_delivery_legs.delivery_leg_id,
1426: wsh_trips.carrier_id, wsh_delivery_details.tracking_number,
1427: wsh_delivery_details.delivery_detail_id
1428: into l_delivery_id, l_delivery_leg_id, l_carrier_id, l_tracking_number,
1429: l_delivery_detail_id
1426: wsh_trips.carrier_id, wsh_delivery_details.tracking_number,
1427: wsh_delivery_details.delivery_detail_id
1428: into l_delivery_id, l_delivery_leg_id, l_carrier_id, l_tracking_number,
1429: l_delivery_detail_id
1430: from wsh_new_deliveries, wsh_delivery_legs, wsh_trips,
1431: wsh_trip_stops, wsh_delivery_details, wsh_delivery_assignments
1432: where wsh_delivery_assignments.DELIVERY_ID = wsh_new_deliveries.DELIVERY_ID
1433: and wsh_delivery_assignments.DELIVERY_DETAIL_ID =
1434: wsh_delivery_details.DELIVERY_DETAIL_ID
1431: wsh_trip_stops, wsh_delivery_details, wsh_delivery_assignments
1432: where wsh_delivery_assignments.DELIVERY_ID = wsh_new_deliveries.DELIVERY_ID
1433: and wsh_delivery_assignments.DELIVERY_DETAIL_ID =
1434: wsh_delivery_details.DELIVERY_DETAIL_ID
1435: and wsh_delivery_legs.delivery_id = wsh_new_deliveries.delivery_id
1436: and wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
1437: and wsh_trip_stops.trip_Id = wsh_trips.trip_id
1438: and wsh_trips.carrier_id = l_carrier_id
1439: and wsh_delivery_details.tracking_number = l_tracking_id
1432: where wsh_delivery_assignments.DELIVERY_ID = wsh_new_deliveries.DELIVERY_ID
1433: and wsh_delivery_assignments.DELIVERY_DETAIL_ID =
1434: wsh_delivery_details.DELIVERY_DETAIL_ID
1435: and wsh_delivery_legs.delivery_id = wsh_new_deliveries.delivery_id
1436: and wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
1437: and wsh_trip_stops.trip_Id = wsh_trips.trip_id
1438: and wsh_trips.carrier_id = l_carrier_id
1439: and wsh_delivery_details.tracking_number = l_tracking_id
1440: and wsh_delivery_legs.parent_delivery_leg_id is null;--Rel 12 MDC Changes
1436: and wsh_delivery_legs.pick_up_stop_id = wsh_trip_stops.stop_id
1437: and wsh_trip_stops.trip_Id = wsh_trips.trip_id
1438: and wsh_trips.carrier_id = l_carrier_id
1439: and wsh_delivery_details.tracking_number = l_tracking_id
1440: and wsh_delivery_legs.parent_delivery_leg_id is null;--Rel 12 MDC Changes
1441:
1442:
1443:
1444: insert into wsh_delivery_leg_activities
1530: loading_start_datetime = l_begin_loading_date,
1531: loading_end_datetime = l_end_loading_date
1532: where wsh_trip_stops.stop_id =
1533: (select pick_up_stop_id
1534: from wsh_delivery_legs
1535: where delivery_leg_id = l_delivery_leg_id);
1536:
1537: update wsh_trip_stops
1538: set actual_arrival_date = l_arrival_date,
1540: unloading_start_datetime = l_begin_unloading_date,
1541: unloading_end_datetime = l_end_unloading_date
1542: where wsh_trip_stops.stop_id =
1543: (select drop_off_stop_id
1544: from wsh_delivery_legs
1545: where delivery_leg_id = l_delivery_leg_id);
1546:
1547: -- Call the procedure get_delivery_details to delete all the
1548: -- details and POD information for a delivery leg and retain only the
1950: x_msg_data OUT NOCOPY VARCHAR2,
1951: p_delivery_leg_id IN NUMBER,
1952: p_received_date IN DATE)
1953: IS
1954: l_leg_Tab WSH_DELIVERY_LEGS_GRP.dlvy_leg_tab_type;
1955: l_in_rec WSH_DELIVERY_LEGS_GRP.action_parameters_rectype;
1956: l_out_rec WSH_DELIVERY_LEGS_GRP.action_out_rec_type;
1957:
1958: -- Return values
1951: p_delivery_leg_id IN NUMBER,
1952: p_received_date IN DATE)
1953: IS
1954: l_leg_Tab WSH_DELIVERY_LEGS_GRP.dlvy_leg_tab_type;
1955: l_in_rec WSH_DELIVERY_LEGS_GRP.action_parameters_rectype;
1956: l_out_rec WSH_DELIVERY_LEGS_GRP.action_out_rec_type;
1957:
1958: -- Return values
1959: l_return_status VARCHAR2(10);
1952: p_received_date IN DATE)
1953: IS
1954: l_leg_Tab WSH_DELIVERY_LEGS_GRP.dlvy_leg_tab_type;
1955: l_in_rec WSH_DELIVERY_LEGS_GRP.action_parameters_rectype;
1956: l_out_rec WSH_DELIVERY_LEGS_GRP.action_out_rec_type;
1957:
1958: -- Return values
1959: l_return_status VARCHAR2(10);
1960: l_msg_count NUMBER;
2009: DELIVERY_LEG_ID, DROP_OFF_STOP_ID,
2010: WTL.STATUS_CODE,WND.ULTIMATE_DROPOFF_LOCATION_ID,
2011: WTL.STOP_LOCATION_ID, WND.ORGANIZATION_ID, WND.DELIVERY_ID
2012: FROM
2013: WSH_DELIVERY_LEGS WDL ,
2014: WSH_NEW_DELIVERIES WND,
2015: WSH_TRIP_STOPS WTL
2016: WHERE
2017: WND.DELIVERY_ID= WDL.DELIVERY_ID AND
2019: WDL.delivery_leg_id = l_delivery_leg_id;
2020:
2021: cursor get_org_delivery_info ( c_delivery_leg_id NUMBER) IS
2022: SELECT wnd.delivery_id, wnd.organization_id FROM
2023: wsh_delivery_legs wdl, wsh_new_deliveries wnd
2024: WHERE wdl.delivery_id = wnd.delivery_id AND
2025: wdl.delivery_leg_id = c_delivery_leg_id;
2026:
2027: BEGIN