{ PROGRAMA : veprmt040 OBJETIVO : AUTORIZACIONES DESCUENTOS PROGRAMADOR : ING. JUAN FRANCISCO SOTO FECHA DESARROLLO : 24/08/2015 } SCHEMA smarmotech GLOBALS DEFINE pvetb88 RECORD LIKE vetb00088.*, porc_desc DEC(8,2), opt VARCHAR(3) DEFINE usuarios,clave,nombre,nombre_v,descripcion VARCHAR(50), impresor,ptipo SMALLINT, pcotizacion,secCliente,psecvend,idx,s_idx INT, pneto,subtotal,descuento,itbis,porc_itbis DEC(12,2), pfecha DATE, salida STRING, chdescuento varchar(2), p_vetb50 RECORD LIKE vetb00050.* DEFINE arr_items DYNAMIC ARRAY OF RECORD area smallint, cod_n smallint, cod_grupo smallint, cod_tipo smallint, cod_sec smallint, descripcion varchar(100), cantidad dec(12,5), precio dec(12,2), valor dec(12,2), porc_desc dec(12,2), valor_desc dec(12,2), costo dec(12,5), valor_costo dec(12,5), margen dec(12,2), margen_porc dec(12,3), descuento_aplicado dec(12,2) END RECORD DEFINE data_imp RECORD cotizacion_no,tipo_cliente,sec_cliente INT, fecha DATE, sec_vend INT, direccion_cliente,nombre,contacto,nombre_proyecto,direccion_proyecto,nombre_ciudad, nombre_vend,nombre_cliente VARCHAR(100), rnc VARCHAR(11), telefono_o,telefono_r,celular,celular1 VARCHAR(25), email VARCHAR(100), orden,cond_pago INT, soportes,instalador,plazo_entrega VARCHAR(100), comentario VARCHAR(250), sub_total,monto_desc,porc_itbis,neto,total_bruto,monto_itbis,total_neto DEC(12,2), num_emp_int,vendedor_aux INT,bodega INT, tbodega VARCHAR(100) END RECORD END GLOBALS MAIN DEFER INTERRUPT CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave CALL ARG_VAL(4) RETURNING impresor CONNECT TO "smarmotech" AS "MSSQL" USER usuarios USING clave OPEN WINDOW vefmmt040 WITH FORM "vefmmt040" DIALOG INPUT BY NAME pcotizacion ATTRIBUTE(WITHOUT DEFAULTS) AFTER FIELD pcotizacion IF pcotizacion IS NOT NULL THEN SET CONNECTION "MSSQL" LOCATE p_vetb50.guiid IN MEMORY { SELECT a.tipo_cliente,a.sec_cliente,a.nombre_cliente, a.total_bruto,a.monto_desc,a.monto_itbi,a.total_neto, a.sec_vend,CONVERT(CHAR(10), a.fecha,103),b.nom1_emp||' '||b.apell1_emp, a.porc_itbi} SELECT a.*,b.nom1_emp||' '||b.apell1_emp INTO p_vetb50.*,data_imp.nombre_vend FROM vetb00050 a,adtb00003 b WHERE a.cotizacion_no =pcotizacion AND a.sec_vend = b.num_emp IF STATUS = NOTFOUND THEN CALL fgl_winmessage("ERROR","COTIZACION NO EXISTE","INFO") NEXT FIELD pcotizacion END IF DISPLAY BY NAME p_vetb50.tipo_cliente ,p_vetb50.sec_cliente,p_vetb50.nombre_cliente,p_vetb50.total_bruto, p_vetb50.monto_desc,p_vetb50.monto_itbi,p_vetb50.total_neto, p_vetb50.sec_vend,p_vetb50.fecha,data_imp.nombre_vend # CONTROL ORDEN DE PEDIDOS SELECT DISTINCT a.cotizacion_no FROM prtb00012 a WHERE a.cotizacion_no = pcotizacion AND a.status_t IS NULL IF STATUS <> NOTFOUND THEN CALL fgl_winmessage("INFO","COTIZACION TIENE ORDEN, NO PUEDES OTORGAR DESCUENTO","INFO") NEXT FIELD pcotizacion END IF END IF CALL arr_items.clear() END INPUT INPUT ARRAY arr_items FROM s_items.* ATTRIBUTE(WITHOUT DEFAULTS) BEFORE INPUT DECLARE busca_items CURSOR FOR SELECT a.area,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,b.descrip_esp,a.cantidad,a.precio,'0', a.porc_desc,'0',c.material+c.gastos+c.labor,'0','0','0',d.porc_descuento FROM vetb00051 a INNER JOIN iptb00002 b ON 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 LEFT OUTER JOIN iptb00004 c ON b.cod_n = c.cod_n AND b.cod_grupo = c.cod_grupo AND b.cod_tipo = c.cod_tipo AND b.cod_sec = c.cod_sec AND c.ano = YEAR(TODAY) AND c.mes_ini = '01' AND c.mes_fin ='12' LEFT OUTER JOIN vetb00088 d ON a.cod_n = d.cod_n AND a.cod_grupo = d.cod_grupo AND a.cod_tipo = d.cod_tipo AND a.cod_sec = d.cod_Sec AND a.cotizacion_no = d.cotizacion_no WHERE a.cotizacion_no = pcotizacion LET idx = 1 FOREACH busca_items INTO arr_items[idx].* LET arr_items[idx].valor = arr_items[idx].cantidad*arr_items[idx].precio LET arr_items[idx].valor_desc = arr_items[idx].valor*(arr_items[idx].porc_desc/100) LET arr_items[idx].valor_costo = arr_items[idx].costo * arr_items[idx].cantidad LET arr_items[idx].margen = (arr_items[idx].valor - arr_items[idx].valor_desc)- arr_items[idx].valor_costo IF arr_items[idx].valor_costo >0 THEN LET arr_items[idx].margen_porc = ((arr_items[idx].precio - (arr_items[idx].costo *1.63))/ arr_items[idx].precio)*100 ELSE LET arr_items[idx].margen_porc = 0 END IF LET idx=idx + 1 END FOREACH ON ACTION ACTUALIZAR LET opt = fgl_winquestion("INFO","ESTA SEGURO DE ACTUALIZAR?","NO","YES|NO","QUESTION",0) IF opt = "YES" THEN BEGIN WORK FOR idx = 1 TO arr_items.getLength() IF arr_items[idx].descuento_aplicado IS NOT NULL THEN IF arr_items[idx].cod_Sec IS NOT NULL THEN SELECT b.descrip_esp,b.descuento_permitido INTO arr_items[idx].descripcion,chdescuento FROM vetb00051 a,iptb00002 b WHERE a.cotizacion_no = pcotizacion AND a.cod_n = arr_items[idx].cod_n AND a.cod_grupo = arr_items[idx].cod_grupo AND a.cod_tipo = arr_items[idx].cod_tipo AND a.cod_sec = arr_items[idx].cod_sec AND a.area = arr_items[idx].area AND 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 IF STATUS = NOTFOUND THEN ROLLBACK WORK CALL fgl_Winmessage("ERROR","CODIGO NO PERTENECE A COTIZACION","INFO") NEXT FIELD cod_n END IF IF chdescuento = "NO" THEN DISPLAY arr_items[idx].descripcion TO s_items[s_idx].descripcion ATTRIBUTE(RED) CALL msg(1010) CALL arr_items.deleteElement(idx) END IF END IF IF arr_items[idx].area IS NOT NULL THEN SELECT a.cotizacion_no FROM vetb00088 a WHERE a.cotizacion_no = pcotizacion AND a.area = arr_items[idx].area AND a.cod_n = arr_items[idx].cod_n AND a.cod_grupo = arr_items[idx].cod_grupo AND a.cod_tipo = arr_items[idx].cod_tipo AND a.cod_Sec = arr_items[idx].cod_sec IF STATUS = NOTFOUND THEN INSERT INTO vetb00088 (cotizacion_no,fecha_autorizacion,area,cod_n,cod_grupo,cod_tipo,cod_Sec,porc_descuento,costo,porc_desc,us_autoriza,autoriza) VALUES (pcotizacion,getdate(),arr_items[idx].area,arr_items[idx].cod_n,arr_items[idx].cod_grupo,arr_items[idx].cod_tipo,arr_items[idx].cod_sec, arr_items[idx].descuento_aplicado,arr_items[idx].costo, arr_items[idx].porc_desc,usuarios,'SI') ELSE UPDATE vetb00088 SET vetb00088.porc_descuento =arr_items[idx].descuento_aplicado, vetb00088.fecha_autorizacion=getdate(), us_autoriza = usuarios, autoriza = 'SI' WHERE cotizacion_no = pcotizacion AND area = arr_items[idx].area AND cod_n = arr_items[idx].cod_n AND cod_grupo = arr_items[idx].cod_grupo AND cod_tipo = arr_items[idx].cod_tipo AND cod_sec = arr_items[idx].cod_sec END IF CALL registra_log(arr_items[idx].porc_desc,arr_items[idx].area,arr_items[idx].cod_n, arr_items[idx].cod_grupo,arr_items[idx].cod_tipo,arr_items[idx].cod_sec) CALL actualiza_cotizacion(arr_items[idx].descuento_aplicado,arr_items[idx].area,arr_items[idx].cod_n,arr_items[idx].cod_grupo,arr_items[idx].cod_tipo,arr_items[idx].cod_sec) END IF END IF END FOR COMMIT WORK CALL asignavalores() CALL impresion(data_imp.*,'veprmt049.4rp','PDF',arr_items.getlength(),"COTIZACION") RETURNING salida CALL msg(13) END IF NEXT FIELD pcotizacion END INPUT ON ACTION CANCEL CALL fgl_winmessage("ERROR","OPERACION ABORTADA","INFO") RETURN END DIALOG CLOSE WINDOW vefmmt040 END MAIN FUNCTION actualiza_cotizacion(xporc_desc,xarea,codn,codgrupo,codtipo,codsec) DEFINE total_bruto,xporc_desc DEC(12,2), codn,codgrupo,codtipo,codsec,xarea INT UPDATE vetb00051 SET porc_desc = xporc_Desc, us_mod = usuarios, fech_mod = getdate(), sincronizado=0 WHERE cotizacion_no = pcotizacion AND area = xarea AND cod_n = codn AND cod_grupo = codgrupo AND cod_tipo = codtipo AND cod_sec = codsec SELECT SUM(a.cantidad*a.precio),ISNULL(SUM((a.cantidad*a.precio)*(a.porc_desc/100)),0) INTO p_vetb50.total_bruto,descuento FROM vetb00051 a WHERE a.cotizacion_no = pcotizacion LET subtotal = p_vetb50.total_bruto - descuento LET itbis = subtotal * (p_vetb50.porc_itbi/100) LET pneto = subtotal + itbis LET p_vetb50.total_neto = pneto LET p_vetb50.monto_itbi = itbis LET p_vetb50.sub_total = subtotal LET p_vetb50.monto_desc = descuento UPDATE vetb00050 SET vetb00050.total_bruto = p_vetb50.total_bruto, monto_desc = p_vetb50.monto_desc, monto_itbi= p_vetb50.monto_itbi, sub_total = p_vetb50.sub_total, total_neto = p_vetb50.total_neto, us_mod = usuarios,fech_mod = getdate(), sincronizado=0 WHERE cotizacion_no = pcotizacion END FUNCTION FUNCTION registra_log(xporc_desc,xarea,codn,codgrupo,codtipo,codsec) define codn,codgrupo,codtipo,codsec,xarea INT, xporc_desc DEC(12,2) INSERT INTO vetb00094 (cotizacion_no,fecha_registro,us_crea,area,cod_n,cod_grupo,cod_tipo,cod_sec,porc_desc) VALUES (pcotizacion,getdate(),usuarios,xarea,codn,codgrupo,codtipo,codsec, xporc_desc) END FUNCTION FUNCTION asignavalores() #Busca el lugar de entrega LET p_vetb50.titulo_bodega = null SELECT a.descripcion INTO p_vetb50.titulo_bodega FROM intb00009 a WHERE a.cod_bodega = p_vetb50.bodega LET data_imp.cotizacion_no = p_vetb50.cotizacion_no LET data_imp.tipo_cliente = p_vetb50.tipo_cliente LET data_imp.sec_cliente = p_vetb50.sec_cliente LET data_imp.direccion_cliente = p_vetb50.direccion_cliente LET data_imp.nombre = p_vetb50.nombre_cliente LET data_imp.contacto = p_vetb50.contacto LET data_imp.nombre_proyecto = p_vetb50.nombre_proyecto LET data_imp.direccion_proyecto = p_vetb50.direccion_proyecto LET data_imp.cond_pago = p_vetb50.cond_pago LET data_imp.fecha = p_vetb50.fecha LET data_imp.sec_vend = p_Vetb50.sec_vend LET data_imp.nombre_cliente = p_vetb50.nombre_cliente LET data_imp.total_neto = p_vetb50.total_neto LET data_imp.comentario = p_vetb50.comentario #LET data_imp.nombre_vend = nombre_vend LET data_imp.rnc = p_vetb50.rnc LET data_imp.telefono_o =p_vetb50.telefono_o LET data_imp.telefono_r = p_vetb50.telefono_r LET data_imp.celular = p_vetb50.celular LET data_imp.celular1 = p_vetb50.celular1 LET data_imp.email = p_vetb50.email # LET data_imp.orden =prtb12.num_oc LET data_imp.plazo_entrega = p_vetb50.plazo_entrega LET data_imp.num_emp_int = p_vetb50.num_emp_inst LET data_imp.sub_total = p_vetb50.sub_total LET data_imp.monto_desc = p_vetb50.monto_desc LET data_imp.porc_itbis = p_vetb50.porc_itbi LET data_imp.neto = p_vetb50.total_neto LET data_imp.total_bruto = p_vetb50.total_bruto LET data_imp.vendedor_aux = p_vetb50.sec_vend_aux LET data_imp.monto_itbis = p_vetb50.monto_itbi END FUNCTION