Files
MBS/PROYECTO/ctdir/ctprrp033.4gl
T

711 lines
21 KiB
Plaintext

{
-------------------------------------------------------------------------------
PROGRAMA : CTPRRP033
OBJETIVO : Desperdicio de Materiales (Mensual)
PROGRAMADOR : Juan F. Soto
FECHA REALIZACION : Noviembre 16, 1995
-------------------------------------------------------------------------------
}
GLOBALS "ctprgb000.4gl"
DEFINE cantidad_t,cant_env,cant_env1 DECIMAL(12,2)
DEFINE ini_fecha CHAR(8)
####### Definicion de variables a usar en el reporte #######
# Costo de la materia prima
DEFINE maestra RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
descrip_esp CHAR(30),
unidad_med CHAR(3)
END RECORD
DEFINE costos1 RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
costo DECIMAL(12,4)
END RECORD
# Material consumido por los semi-elaborados para sumar al inventario
# final
DEFINE estandard RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
cantidad DECIMAL(12,2)
END RECORD
# Inventario inicial
DEFINE inicial RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
cantidad DECIMAL(12,2)
END RECORD
DEFINE inicial1 RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
cantidad DECIMAL(12,2)
END RECORD
DEFINE final1 RECORD
cod_prod SMALLINT,
cantidad DECIMAL(12,2)
END RECORD
# Inventario Final
DEFINE final RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
cantidad DECIMAL(12,2)
END RECORD
# Cantidad de materia prima utilizada en la produccion, codigo 36 de
# movimientos
DEFINE proceso RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
cantidad DECIMAL(12,2)
END RECORD
DEFINE cantidad DECIMAL(12,2)
# Este es el record que se validara para imprimir todas la materia prima
# Variables para asignarles los selects
DEFINE selec1,selec2,selec3,selec4,selec5,selec6,selec7,selec8,
selecj,seleck CHAR(1000)
# Bandera para utilizarla en los loops de busqueda
DEFINE salirj,salirk,salir,salir1,salir2,salir3,salir4,salir6,salir5 CHAR(1)
# Variables de entrada del reporte
DEFINE fecha_ini,fecha_fin DATE,
cod_n,cod_grupo,cod_tipo,cod_sec SMALLINT,
# Indices de busqueda de las informaciones
idx_1,idx_2,idx_3,idx_4,idx_6,idx_7,idx_e,idx_d,idx_c,idx_b,idx_a,
i,j INTEGER
# Variables que determinaran el inventario inicial y el inventario final
# El mes1 buscara el inventario inicial, mes_fin buscara el final.
DEFINE mes_fin SMALLINT
DEFINE mes1_1,mes1_2,mes2_1,mes2_2 DATE
DEFINE mes1,ano1 SMALLINT
# Variable para buscar el costo del ano
DEFINE p_ano CHAR(4)
FUNCTION ctprrp033()
#WHENEVER ERROR CONTINUE
OPTIONS
FORM LINE 8,
ERROR LINE 23,
COMMENT LINE 21
OPEN FORM ctfmrp033 FROM "ctfmrp033"
DISPLAY FORM ctfmrp033
CALL pantalla()
DISPLAY "ctprrp033" AT 4,3
DISPLAY "Desperdicios de Materiales" AT 6,27
LET tipo_papel = 2
CALL msgrp000(tipo_papel)
LET p_ano = year(today) USING "&&&&"
LET p_ano1= year(today) USING "&&&&"
########### Captura de valores para el criterio de busqueda ############
INPUT BY NAME ano1,mes1
AFTER FIELD ano1
IF ano1 IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD ano1
END IF
AFTER FIELD mes1
IF mes1 IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD mes1
END IF
LET p_ano = ano1 USING "&&&&"
LET mes2 = mes1 - 1
LET p_ano1 = ano1 USING "&&&&"
IF mes1 = 1 THEN
LET mes2 = 12
LET p_ano1 = ano1 - 1 USING "&&&&"
END IF
SELECT fecha_inicio,fecha_corte INTO mes1_1,mes1_2
FROM prdtable WHERE mes = mes1 AND ano = p_ano
IF STATUS = NOTFOUND THEN
LET numero_msg = 3
CALL msg(numero_msg)
NEXT FIELD mes
END IF
END INPUT
########### Facilidad para cancelar la variacioncon la tecla DELETE ####
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
CONSTRUCT criterio ON a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec
FROM cod_n,cod_grupo,cod_tipo,cod_sec
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
# Busqueda del consumo standard del material, esto es
# La multiplicacion de las cantidades que ha entrado a almacen de pilas
# por el movimiento 20 del inventario de productos terminados por las cantidades
# que contienen las formulas
LET selec4 =
"SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,SUM((b.cantidad/1000)* ",
" c.cantidad_2) ",
"FROM iptb00006 c, catb00001 b,intb00001 a ",
"WHERE b.cod_n_pt = c.cod_n AND b.cod_grupo_pt = c.cod_grupo AND ",
" b.cod_tipo_pt = c.cod_tipo AND b.cod_sec_pt = c.cod_sec AND ",
" b.cod_n_mp = a.cod_n AND b.cod_grupo_mp = a.cod_grupo AND ",
" b.cod_tipo_mp = a.cod_tipo AND b.cod_sec_mp = a.cod_sec AND ",
" c.cod_mov=20 AND c.fecha BETWEEN ? AND ? AND c.status_t IS NULL AND ",
" b.status_t IS NULL AND ",criterio CLIPPED,
" GROUP BY 1,2,3,4 ORDER BY 1,2,3,4 "
DISPLAY "<<Buscando Consumo Standard ... Espere por Favor. >>" AT 17,14
ATTRIBUTE(REVERSE,BOLD)
PREPARE comando4 FROM selec4
DECLARE stand SCROLL CURSOR FOR comando4
OPEN stand USING mes1_1,mes1_2
LET selec8 =
"SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.descrip_esp, ",
" a.unidad_med FROM intb00001 a,intb00002 b ",
"WHERE a.cod_n = b.cod_n AND a.cod_grupo = b.cod_grupo AND ",
" a.cod_tipo = b.cod_tipo AND a.cod_sec = b.cod_sec AND ",
" a.status_t is null and b.status_t is null and ",
criterio CLIPPED, " ORDER BY 1,2,3,4 "
DISPLAY "Buscando Materiales ... Espere Por Favor" AT 17,14
ATTRIBUTE(BOLD)
LET selec11 =
"SELECT COUNT(*) ",
"FROM intb00001 a,intb00002 b ",
"WHERE a.cod_n = b.cod_n AND a.cod_grupo = b.cod_grupo AND ",
" a.cod_tipo = b.cod_tipo AND a.cod_sec = b.cod_sec AND ",
criterio CLIPPED
PREPARE comando10 FROM selec11
DECLARE busca10 CURSOR FOR comando10
OPEN busca10
FETCH busca10 INTO regi
PREPARE comando FROM selec8
DECLARE busca_ma CURSOR FOR comando
OPEN busca_ma
# busqueda de la sumatoria del consumo del material que sale del almacen
LET selec1 =
"SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,sum(a.cantidad_2)*-1 ",
"FROM intb00006 a ",
"WHERE a.fecha BETWEEN ? AND ? AND a.cod_mov = 36 AND ",
" a.status_t is null AND ",criterio CLIPPED,
" GROUP BY 1,2,3,4 ORDER BY 1,2,3,4"
DISPLAY "<< Materiales en Proceso ... Espere Por Favor. >>" AT 17,14
ATTRIBUTE(REVERSE,BOLD)
PREPARE comando8 FROM selec1
DECLARE proces SCROLL CURSOR FOR comando8
OPEN proces USING mes1_1,mes1_2
LET selec2 =
"SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,MAX(a.cantidad) ",
"FROM cttb00015 a ",
"WHERE a.ano = ? AND a.mes = ? AND a.status_t is null AND ",
criterio CLIPPED," GROUP BY 1,2,3,4 ORDER BY 1,2,3,4"
DISPLAY " " AT 17,14
DISPLAY "<< Buscando Inv. Inicial ... Espere Por Favor. >>" AT 17,14
ATTRIBUTE(REVERSE,BOLD)
PREPARE comando1 FROM selec2
DECLARE inicio SCROLL CURSOR FOR comando1
OPEN inicio USING p_ano1,mes2
# Busqueda del inventario final de la materia prima apartir del mes inicial
# y el ano
LET selec3 =
"SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,MAX(a.cantidad) ",
"FROM cttb00015 a ",
"WHERE a.mes = ? AND a.ano = ? AND a.status_t IS NULL AND ",
criterio CLIPPED,"GROUP BY 1,2,3,4 ORDER BY 1,2,3,4"
DISPLAY " " AT 17,14
DISPLAY "<< Buscando Inv. final ... Espere Por Favor. >>" AT 17,14
ATTRIBUTE(REVERSE,BOLD)
PREPARE comando2 FROM selec3
DECLARE fin SCROLL CURSOR FOR comando2
OPEN fin USING mes1,ano1
# Busqueda del costo standard para cada material
LET selec5 =
"SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,MAX(a.costo_st) ",
"FROM intb00013 a ",
"WHERE a.ano = ? and a.status_t is null AND a.mes_fin = 12 AND ",
criterio CLIPPED," GROUP BY 1,2,3,4 ORDER BY 1,2,3,4"
DISPLAY " " AT 17,14
DISPLAY "<< Buscando Costos Std ... Espere Por Favor. >>" AT 17,14
ATTRIBUTE(REVERSE,BOLD)
PREPARE comando5 FROM selec5
DECLARE cost SCROLL CURSOR FOR comando5
OPEN cost USING ano1
DISPLAY " " AT 17,14
START REPORT desperdicio TO PIPE "lp -dcentral"
DISPLAY "<< Reporte Generandose ... Por Favor Espere. >>"
AT 17,14 ATTRIBUTE (REVERSE)
# Loop inicial de busqueda de las informaciones de la materia prima
LET p_param = "S"
LET salir = "N"
WHILE salir != "S"
FETCH busca_ma INTO maestra.*
IF STATUS = NOTFOUND THEN
LET salir = "S"
EXIT WHILE
END IF
CALL termometro(regi,p_param)
LET p_param = "N"
IF int_flag THEN
LET int_flag = FALSE
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
LET datos1.cod_n = maestra.cod_n
LET datos1.cod_grupo = maestra.cod_grupo
LET datos1.cod_tipo = maestra.cod_tipo
LET datos1.cod_sec = maestra.cod_sec
LET datos1.descrip_esp = maestra.descrip_esp
LET datos1.unidad_med = maestra.unidad_med
LET datos1.mat_proceso = 0
LET datos1.inv_inicial = 0
LET datos1.cons_real = 0
LET datos1.cons_std = 0
LET datos1.costo = 0
LET inicial1.cantidad = 0
LET cantidad_t = 0
CALL calcula_sm13()
IF cantidad_t is null THEN
LET cantidad_t = 0
END IF
LET datos1.cant_env1 = cantidad_t
LET cantidad_t = 0
CALL calcula_sm3()
IF cantidad_t is null THEN
LET cantidad_t = 0
END IF
LET datos1.cant_env = cantidad_t
LET salir1 = "N"
LET idx_1 = 1
WHILE salir1 != "S"
FETCH ABSOLUTE idx_1 inicio INTO inicial.*
IF STATUS = NOTFOUND THEN
LET salir1 = "S"
LET idx_1 = 1
EXIT WHILE
END IF
LET idx_1 = idx_1 + 1
IF datos1.cod_n = inicial.cod_n AND
datos1.cod_grupo = inicial.cod_grupo AND
datos1.cod_tipo = inicial.cod_tipo AND
datos1.cod_sec = inicial.cod_sec THEN
LET datos1.inv_inicial = inicial.cantidad
LET salir1 = "S"
LET idx_1 = 1
EXIT WHILE
END IF
END WHILE
IF datos1.inv_inicial IS NULL THEN
LET datos1.inv_inicial = 0
END IF
LET salir2 = "N"
LET status = 0
LET idx_2 = 1
WHILE salir2 != "S"
FETCH ABSOLUTE idx_2 fin INTO final.*
IF STATUS = NOTFOUND THEN
LET salir2 = "S"
LET idx_2 = 1
EXIT WHILE
END IF
LET idx_2 = idx_2 + 1
IF datos1.cod_n = final.cod_n AND
datos1.cod_grupo = final.cod_grupo AND
datos1.cod_tipo = final.cod_tipo AND
datos1.cod_sec = final.cod_sec THEN
LET datos1.inv_final = final.cantidad
LET salir2 = "S"
LET idx_2 = 1
EXIT WHILE
END IF
END WHILE
IF datos1.inv_final IS NULL THEN
LET datos1.inv_final = 0
END IF
LET salir3 = "N"
LET idx_3 = 1
WHILE salir3 != "S"
FETCH ABSOLUTE idx_3 proces INTO proceso.*
IF STATUS = NOTFOUND THEN
LET salir3 = "S"
LET idx_3 = 1
EXIT WHILE
END IF
LET idx_3 = idx_3 + 1
IF datos1.cod_n = proceso.cod_n AND
datos1.cod_grupo = proceso.cod_grupo AND
datos1.cod_tipo = proceso.cod_tipo AND
datos1.cod_sec = proceso.cod_sec THEN
LET datos1.mat_proceso = proceso.cantidad
LET salir3 = "S"
LET idx_3 = 1
EXIT WHILE
END IF
END WHILE
IF datos1.mat_proceso IS NULL THEN
LET datos1.mat_proceso = 0
END IF
LET salir4 = "N"
LET idx_4 = 1
# Loop para la busqueda del consumo Estandard
WHILE salir4 != "S"
FETCH ABSOLUTE idx_4 stand INTO estandard.*
IF STATUS = NOTFOUND THEN
LET salir4 = "S"
LET idx_4 = 1
EXIT WHILE
END IF
LET idx_4 = idx_4 + 1
IF maestra.cod_n = estandard.cod_n AND
maestra.cod_grupo = estandard.cod_grupo AND
maestra.cod_tipo = estandard.cod_tipo AND
maestra.cod_sec = estandard.cod_sec THEN
LET datos1.cons_std = estandard.cantidad
LET salir4 = "S"
LET idx_4 = 1
EXIT WHILE
END IF
END WHILE
IF datos1.cons_std IS NULL THEN
LET datos1.cons_std = 0
END IF
LET salir6 = "N"
LET idx_6 = 1
WHILE salir6 != "S"
FETCH ABSOLUTE idx_6 cost INTO costos1.*
IF STATUS = NOTFOUND THEN
LET salir6 = "S"
LET idx_6 = 1
EXIT WHILE
END IF
LET idx_6 = idx_6 + 1
IF maestra.cod_n = costos1.cod_n AND
maestra.cod_grupo = costos1.cod_grupo AND
maestra.cod_tipo = costos1.cod_tipo AND
maestra.cod_sec = costos1.cod_sec THEN
LET datos1.costo = costos1.costo
LET salir6 = "S"
LET idx_6 = 1
EXIT WHILE
END IF
END WHILE
IF datos1.costo IS NULL THEN
LET datos1.costo = 0
END IF
OUTPUT TO REPORT desperdicio(datos1.*,mes1_1,mes1_2)
END WHILE
FINISH REPORT desperdicio
CLEAR SCREEN
RUN "type C:\\archivo > %USPRINT%" END FUNCTION
# Rutina de Impresion de las informaciones
REPORT desperdicio(x,fech1,fech2)
# Variable para tomar las informaciones
DEFINE x RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
descrip_esp CHAR(30),
unidad_med CHAR(3),
inv_inicial DECIMAL(12,2),
inv_final DECIMAL(12,2),
mat_proceso DECIMAL(12,2),
cons_real DECIMAL(12,2),
cons_std DECIMAL(12,2),
cant_env DECIMAL(12,2),
cant_env1 DECIMAL(12,2),
costo DECIMAL(12,2)
END RECORD,
stand DECIMAL(12,2),
cons_proc DECIMAL(12,2),
cons_real DECIMAL(12,2),
var DECIMAL(12,2),
var1 DECIMAL(5,2),
descrip_esp CHAR(30),
unidad_med CHAR(20),
in_ini DECIMAL(12,2),
in_fin DECIMAL(12,2),
desp DECIMAL(12,2)
# Vaiables para la impresion de caracters ASCII
DEFINE fech1,fech2 DATE
DEFINE doble_on CHAR(3)
DEFINE doble_off CHAR(3)
DEFINE negrillas_on CHAR(6)
DEFINE negrillas_off CHAR(6)
DEFINE comp_on CHAR(3)
DEFINE comp_off CHAR(2)
DEFINE doce CHAR(3)
DEFINE normal CHAR(3)
DEFINE hora CHAR(5)
# Variables para diferentes calculos que se especificaran mas adelante
DEFINE val_desp,t_val_desp,valor,t_valor,
total_p,total_m DECIMAL(12,2)
# Variables para el nombre de los meses
DEFINE nom_mes1,nom_mes2 CHAR(12)
OUTPUT
TOP MARGIN 0
LEFT MARGIN 0
BOTTOM MARGIN 2
FORMAT
PAGE HEADER
# Validacion de los caracteres ascii
LET doble_on = ASCII 001
LET doble_off = ASCII 002
LET negrillas_on = ASCII 27, ASCII 098
LET negrillas_off = ASCII 27, ASCII 099
LET comp_on = ASCII 31
LET comp_off = ASCII 029
LET doce = ASCII 030
LET normal = ASCII 029
LET hora = time
LET l = (90 - LENGTH(p_compania.nombre CLIPPED)) / 2
# Impresion de los encabezados
PRINT comp_off,negrillas_on
PRINT COLUMN 1, "ctprrp033",
COLUMN l, p_compania.nombre CLIPPED,
COLUMN 80, "Pag. ",
pageno using "###"
LET l = (90 - LENGTH("Sistema de Costos")) / 2
PRINT COLUMN l, "Sistema de Costos",
COLUMN 80, today using "dd/mm/yy"
LET l = (90 - LENGTH("DESPERDICIOS DE MATERIALES")) / 2
PRINT COLUMN l, "DESPERDICIOS DE MATERIALES",
COLUMN 80, hora
PRINT COLUMN 1,comp_on,negrillas_on
PRINT COLUMN 1,"Periodo: ",fech1 USING "dd/mm/yy",
" AL ",fech2 USING "dd/mm/yy"
PRINT COLUMN 1,
"---------------------------------------------------------",
"---------------------------------------------------------",
"-----------------------------------------------------------"
PRINT COLUMN 46, "Materiales",
COLUMN 58,"Inventario",
COLUMN 70, "Inventario"
PRINT COLUMN 1, "Material",
COLUMN 46, "A Proceso",
COLUMN 58, "Inicial",
COLUMN 70, "Final",
COLUMN 87, "Cantidad",
COLUMN 97, "Desperdicio",
COLUMN 114, "Costo",
COLUMN 130, "Valor"
PRINT COLUMN 58, fech1 using "dd/mm/yy",
COLUMN 87, "Standard"
PRINT COLUMN 1,
"--------------------------------------------------------",
"--------------------------------------------------------",
"----------------------------------------------------------"
,negrillas_off
ON EVERY ROW
# Calculo para valorizar la variacion
IF t_val_desp is null THEN
LET t_val_desp = 0
END IF
IF x.costo IS NULL THEN
LET x.costo = 0
END IF
IF x.mat_proceso < 0 THEN
LET x.mat_proceso = x.mat_proceso * -1
END IF
#------------------------------------------------------------------------------
# Calculo del desperdicio del material y Valorizacion
LET x.inv_final = x.inv_final + x.cant_env
LET x.inv_inicial = x.inv_inicial + x.cant_env1
LET desp = x.mat_proceso + x.inv_inicial - x.inv_inicial - x.cons_std
LET val_desp = desp * x.costo
LET t_val_desp = t_val_desp + val_desp
PRINT COLUMN 1, x.cod_n using "&",x.cod_grupo USING "&",
x.cod_tipo USING "&&",x.cod_sec USING "&&&"," ",
x.descrip_esp," ",
x.unidad_med,
COLUMN 43, x.mat_proceso USING "##,###,###.##",
COLUMN 57, x.inv_inicial USING "###,###.##",
COLUMN 69, x.inv_final USING "###,###.###",
COLUMN 82, x.cons_std USING "(((,(((,((#.##)",
COLUMN 96, desp USING "(((,(((,(##.##)",
COLUMN 110, x.costo USING "##,###.##",
COLUMN 121, val_desp USING "###,###,###.##"
# Impresion de la totalizacion del valor standard
ON LAST ROW
PRINT negrillas_on
PRINT COLUMN 121, "----------------"
PRINT COLUMN 118, t_val_desp using "#,###,###,###.##"
LET t_val_desp = 0
LET t_valor = 0
PRINT negrillas_off,comp_off
END REPORT
FUNCTION calcula_sm13()
DEFINE prod RECORD
cod_prod SMALLINT,
cantidad DECIMAL(12,2)
END RECORD,
factor,cantidad_f DECIMAL(8,5),
cantidad_i DECIMAL(12,3)
DECLARE busca1 CURSOR FOR
SELECT unique a.cod_prod,a.cant_prop,(a.cant_prop * b.cantidad) * 1000
FROM cttb00022 a,cttb00014 b
WHERE a.cod_n = datos1.cod_n and a.cod_grupo = datos1.cod_grupo and
a.cod_tipo = datos1.cod_tipo and a.cod_sec = datos1.cod_sec and
a.cod_prod = b.cod_prod and b.mes = mes2 and b.ano = p_ano1 and
a.status_t is null
FOREACH busca1 INTO prod.*,cantidad_i
IF prod.cantidad is null THEN
LET prod.cantidad = 0
END IF
LET cantidad_t = cantidad_t + cantidad_i
END FOREACH
RUN "type C:\\archivo > %USPRINT%" END FUNCTION
FUNCTION calcula_sm3()
DEFINE prod RECORD
cod_prod SMALLINT,
cantidad DECIMAL(12,2)
END RECORD,
factor,cantidad_f DECIMAL(8,5),
cantidad_i DECIMAL(12,3)
DECLARE busca CURSOR FOR
SELECT unique a.cod_prod,a.cant_prop,(a.cant_prop*b.cantidad)*1000
FROM cttb00022 a,cttb00014 b
WHERE a.cod_n = datos1.cod_n and a.cod_grupo = datos1.cod_grupo and
a.cod_tipo = datos1.cod_tipo and a.cod_sec = datos1.cod_sec and
a.cod_prod = b.cod_prod and b.mes = mes1 and
b.ano = ano1 and a.status_t is null
FOREACH busca INTO prod.*,cantidad_i
IF prod.cantidad is null THEN
LET prod.cantidad = 0
END IF
LET cantidad_t = cantidad_t + cantidad_i
END FOREACH
RUN "type C:\\archivo > %USPRINT%" END FUNCTION