== Gestión Retail Aberturas ==
*[[Gestión Retail Aberturas: Bitácora]]
*[[Gestión Retail Aberturas: Pendientes]]
*[[Gestión Retail Aberturas: Relaciones]]
=== Gestión de Magnitudes ===

==== Definiciones ====
*Coeficiente: Por defecto, el valor es 1. Si necesita sumar al valor original, el coeficiente tiene que tener la parte entera al menos en 1. En el caso de magnitudes no estándar, los valores del precio del producto puede estar incluido en el mismo, por lo que hay que verificar en este caso los valores que se ingresen en la [[Tabla:precios]]
*Offset: Por defecto, el valor es 0

==== Atributos de Productos/Elementos ====
* M2 = Metro Cuadrado
Precio Unitario = Precio determinado por tipo de cliente * (((((Ancho + OffsetAncho)*Coeficiente Ancho) * ((Alto + OffsetAlto)*Coeficiente Alto))/100000) * Coeficiente Elemento)

* ML = Metro Lineal
Precio Unitario = Precio determinado por tipo de cliente * (((((Ancho + OffsetAncho) * 2 * Coeficiente Ancho) + ((Alto + OffsetAlto) * 2 * Coeficiente Alto)) / 1000) * Coeficiente Elemento)

* MG = Magnitud Galarza
Precio Unitario = Precio determinado por tipo de cliente * ((((Alto + OffsetAlto) * CoeficienteAlto) + (Ancho + OffsetAncho) * CoeficienteAncho)) / 1000) * Coeficiente Elemento)

* UN = Unidad
Precio Unitario = Precio determinado por tipo de cliente * Coeficiente Elemento

=== MacroProgramming ===
<small>
{| class="wikitable"
| <center>'''Nombre'''</center>
| <center>'''Tipo'''</center>
| <center>'''Uso'''</center>
| <center>'''Cross'''</center>
| <center>'''Shooter'''</center>
| <center>'''Observaciones'''</center>
|-
| Main
| Sub
| Lanzador de Chequeos Iniciales
|
| Independiente
|
|-
| Hoy
| Sub
| Push Fecha actual a campo tipo Fecha
| FORM: Presupuesto: Ingresos + Pendientes
|
|
|-
| LookupData
| Sub
| Busca datos de precios correspondientes al Producto/Tipo de Cliente y asigna a los campos
| FORM: Presupuesto: Ingresos + Pendientes
| </br>FIELD: </br>EVENT:
|-
|}
</small>

=== Triggers ===
<small>
{| class="wikitable"
| <center>'''Trigger'''</center>
| <center>'''Event'''</center>
| <center>'''Table'''</center>
| <center>'''Statement'''</center>
| <center>'''Timing'''</center>

|-
| Alta_ListasPrecios
| INSERT
| listasprecios
| <pre>BEGIN
   DECLARE vListaVieja,vListaNueva INT(5);
   DECLARE vFechaModificacion DATE;
   DECLARE vHoraModificacion TIME;
   SET vListaNueva = (SELECT Lista FROM listavigente);
   SET vListaVieja = (SELECT MAX(listasprecios.Lista) 
                      FROM listasprecios 
                      WHERE listasprecios.Lista <> NEW.Lista);
   SET vFechaModificacion = CURDATE();
   SET vHoraModificacion = CURTIME();
   INSERT INTO precios (
      `precios`.`Lista`,
      `precios`.`ProductoID`,
      `precios`.`PrecioProd01`,
      `precios`.`PrecioProd02`,
      `precios`.`PrecioProd03`,
      `precios`.`FechaModificacion`,
      `precios`.`HoraModificacion`)(
   SELECT    vListaNueva,
      `precios`.`ProductoID`,
      `precios`.`PrecioProd01`,
      `precios`.`PrecioProd02`,
      `precios`.`PrecioProd03`,
      vFechaModificacion,
      vHoraModificacion
   FROM precios 
   WHERE `precios`.`Lista` = vListaVieja);
END</pre>
| AFTER

|-
| Alta_LogPrecios
| INSERT
| logprecios
| <pre>BEGIN
   DECLARE vCategoriaID,vProveedorID,vPaso VARCHAR(5);
   SET vCategoriaID = IF(ISNULL(`NEW`.`CategoriaID`),' ',`NEW`.`CategoriaID`);
   SET vProveedorID = IF(ISNULL(`NEW`.`ProveedorID`),' ',`NEW`.`ProveedorID`);
   SET `NEW`.`FechaModificacion` = CURDATE();
   SET `NEW`.`HoraModificacion` = CURTIME();
   SET `NEW`.`Lista` = (SELECT max(`listasprecios`.`Lista`) FROM `listasprecios`);
   IF ISNULL(NEW.CategoriaID) THEN
      IF ISNULL(NEW.ProveedorID) THEN
         UPDATE `precios`,`productos`
         SET    `precios`.`PrecioProd01` = `precios`.`PrecioProd01` * `NEW`.`Coeficiente`,
            `precios`.`PrecioProd02` = `precios`.`PrecioProd02` * `NEW`.`Coeficiente`,
            `precios`.`PrecioProd03` = `precios`.`PrecioProd03` * `NEW`.`Coeficiente`,
            `precios`.`FechaModificacion` = CURDATE(),
            `precios`.`HoraModificacion` = CURTIME()
         WHERE    `precios`.`ProductoID` = `productos`.`ProductoID` AND
               `precios`.`Lista` = `NEW`.`Lista`;
         SET vPaso='A';
      ELSE
         UPDATE `precios`,`productos`
         SET    `precios`.`PrecioProd01` = `precios`.`PrecioProd01` * `NEW`.`Coeficiente`,
            `precios`.`PrecioProd02` = `precios`.`PrecioProd02` * `NEW`.`Coeficiente`,
            `precios`.`PrecioProd03` = `precios`.`PrecioProd03` * `NEW`.`Coeficiente`,
            `precios`.`FechaModificacion` = CURDATE(),
            `precios`.`HoraModificacion` = CURTIME()
         WHERE   `precios`.`ProductoID` = `productos`.`ProductoID` AND
               `precios`.`Lista` = `NEW`.`Lista` AND
               `productos`.`ProveedorID` = NEW.ProveedorID;
         SET vPaso='B';
      END IF;
   ELSE
      IF ISNULL(NEW.ProveedorID) THEN
         UPDATE `precios`,`productos`
         SET    `precios`.`PrecioProd01` = `precios`.`PrecioProd01` * `NEW`.`Coeficiente`,
            `precios`.`PrecioProd02` = `precios`.`PrecioProd02` * `NEW`.`Coeficiente`,
            `precios`.`PrecioProd03` = `precios`.`PrecioProd03` * `NEW`.`Coeficiente`,
            `precios`.`FechaModificacion` = CURDATE(),
            `precios`.`HoraModificacion` = CURTIME()
         WHERE   `precios`.`ProductoID` = `productos`.`ProductoID` AND
               `precios`.`Lista` = `NEW`.`Lista` AND
               `productos`.`CategoriaID` = NEW.CategoriaID;
         SET vPaso='C';
      ELSE
         UPDATE `precios`,`productos`
         SET    `precios`.`PrecioProd01` = `precios`.`PrecioProd01` * `NEW`.`Coeficiente`,
            `precios`.`PrecioProd02` = `precios`.`PrecioProd02` * `NEW`.`Coeficiente`,
            `precios`.`PrecioProd03` = `precios`.`PrecioProd03` * `NEW`.`Coeficiente`,
            `precios`.`FechaModificacion` = CURDATE(),
            `precios`.`HoraModificacion` = CURTIME()
         WHERE   
            `precios`.`ProductoID` = `productos`.`ProductoID` AND
            `precios`.`Lista` = `NEW`.`Lista` AND
            `productos`.`CategoriaID` = vCategoriaID AND
            `productos`.`ProveedorID` = vProveedorID;
         SET vPaso='D';
      END IF;
   END IF;
   SET `NEW`.`RowsMod` = ROW_COUNT();
END</pre>
| BEFORE

|-
| Alta_Precio
| INSERT
| precios
| <pre>'BEGIN
   SET    NEW.FechaModificacion = CURDATE(),
      NEW.HoraModificacion = CURTIME();
  END'</pre>
| BEFORE

|-
| Actualiza_Precio
| UPDATE
| precios
| <pre>'BEGIN
   SET    NEW.FechaModificacion = CURDATE(),
      NEW.HoraModificacion = CURTIME();
  END'</pre>
| BEFORE

|-
| Alta_Productos
| INSERT
| productos
| <pre>BEGIN
    DECLARE vLista INT(5);
    DECLARE vProductoID CHAR(8);
    SET vLista = (SELECT Lista FROM listavigente);
    SET vProductoID = NEW.ProductoID;
    INSERT INTO precios (`precios`.`Lista`, 
                  `precios`.`ProductoID`, 
                  `precios`.`PrecioProd00`,
                  `precios`.`PrecioProd01`, 
                  `precios`.`PrecioProd02`, 
                  `precios`.`PrecioProd03`)
           VALUES(vLista, vProductoID, 0, 0, 0, 0);
    INSERT INTO composicion (`composicion`.`ProductoID`,
                     `composicion`.`ElementoID`,
                     `composicion`.`ValorElemento`,
                     `composicion`.`ElementoPM`)
           VALUES(vProductoID,vProductoID,1, 1);
END</pre>
| BEFORE

|-
| Baja_Productos
| DELETE
| productos
| <pre>BEGIN
    DECLARE vLista INT(5);
    DECLARE vProductoID CHAR(8);
    SET vLista = (SELECT Lista FROM listavigente);
    SET vProductoID = OLD.ProductoID;
    DELETE FROM precios WHERE ProductoID=OLD.ProductoID AND Lista=vLista;
    DELETE FROM composicion WHERE ProductoID=OLD.ProductoID OR ElementoID=OLD.ProductoID;
END</pre>
| AFTER

|-
| AltaTransaccion
| INSERT
| transacciones
| <pre>BEGIN
   SET   NEW.TransaccFecha = CURDATE(),
      NEW.TransaccHora = CURTIME();
END</pre>
| BEFORE

|-
| Baja_Presupuesto
| DELETE
| vidquoten1
| <pre>BEGIN
    DELETE FROM vidquoten2
    WHERE vidquoten2.VidQuoteID=OLD.VidQuoteID;
    DELETE FROM vidquoten3
    WHERE vidquoten3.VidQuoteID=OLD.VidQuoteID;
  END</pre>
| AFTER

|-
| Baja_Item_Presupuesto
| DELETE
| vidquoten2
| <pre>'BEGIN
    DELETE FROM vidquoten3
    WHERE vidquoten3.VidQuoteID=OLD.VidQuoteID AND
     vidquoten3.VidQuoteItem=OLD.VidQuoteItem;
  END'</pre>
| AFTER

|-
| Baja_Elemento_Presupuesto
| DELETE
| vidquoten3
| <pre>BEGIN
   DELETE FROM vidquoten4
    WHERE    vidquoten4.VidQuoteID=OLD.VidQuoteID AND
         vidquoten4.VidQuoteItem=OLD.VidQuoteItem AND
         vidquoten4.VidQuoteElementoID=OLD.VidQuoteElementoID;
END</pre>
| AFTER
|}
</small>

=== Vistas ===
<small>
{| class="wikitable"
| <center>'''Nombre'''</center>
| <center>'''Comando'''</center>
| <center>'''Uso'''</center>
| <center>'''Cross'''</center>

|-
| Viscabdetalla
| FZG.Vista.viscabdetalla.sql
| Vista utilizada para agregar la información de cual es la lista de precios a utilizar para el cliente del presupuesto en tiempo real.FORM: Presupuesto
| Contactos, Vidquoten1

|-
| Proveedores
| FZG.Vista.proveedores.sql
| Visualización de Contactos “Proveedores”
| Contactos

|-
| Clientes
| FZG.Vista.clientes.sql
| Visualización de Contactos “Clientes”
| Contactos

|-
| Visreppres
| FZG.Vista.visreppres.sql
| Vista Reporte Presupuesto Individual. Para generar una línea completa con la información de detalle de los presupuestos con las combinaciones de información a incluir en el mismo. No contiene la información estática del cliente.
| Vislineabs, Visdetaobs

|-
| Viscompodis
| FZG.Vista.viscompodis.sql
| Vista de productos (DISTINCT productos) dentro de la tabla de composición ordenada por alfabéticamente.
| 

|-
| Viscoposimpl
| FZG.Vista.viscomposimpl.sql
| Vista de los elementos de composicion con información para query
| Productos, Composición

|-
| Visdetaobs
| FZG.Vista.visdetaobs.sql
| Une todas las Observaciones de cada item para los casos que se encuentren señaladas con la Descripción del Producto-Item
| Productos, Vidquoten3

|-
| Visintdetpre
| FZG.Vista.visintdetpre.sql
| Reducción de vista Visprodadic aplicable al cálculo de presupuesto con los datos en tiempo real del presupuesto activo en formulario y calculando el precio correcto de acuerdo al cliente y el cálculo del valor del elemento de acuerdo al los valores de Alto y Ancho del Vano en tiempo real
| Visprodadic, Vidquoten2

|-
| Vislineabs
| [[FZG.Vista.vislineabs.sql]]
| Define linea básica para reporte teniendo como base Vidquoten2, agregando la información de la cabecera + datos de descrpción de producto + el subtotal por Producto-Item
| Vidquoten1, Vidquoten2, Productos, Vissubxitem

|-
| Visprodadic
| FZG.Vista.visproadic.sql
| Vista de tabla de componentes con la información de cada elemento como producto y de los precios vigentes.
| Productos, Composicion, PreciosVigentes

|-
| Vissubxitem
| FZG.Vista.vissubxitem.sql
| Subtotal por Item de Presupuesto en tiempo real
| Vidquoten3

|-
| Listavigente
| 
| Selecciona solo el primer registro ordenado en forma descendente de la tabla de listasprecios
| Listasprecios

|-
| Preciosvigentes
| FZG.Vista.preciosvigentes.sql
| Es la selección de la tabla de precios referenciando el mayor valor dentro de la tabla de listasprecios
| Listasprecios, Precios

|-
| Preciosvigact
| FZG.Vista.preciosvigact.sql
| Vista de lista de precios vigentes con datos de productos para actualización columnar.FORM: Actualización por tipo de lista
| Preciosvigentes, Productos

|-
| Precioscmpl
| [[FZG.Vista.precioscmpl.sql]]
| Vista de lista de precios completa con datos de productos. [[FORM: Precios Tabular x Proceso]]
| Precios, Productos

|-
| Visprestot
| FZG.Vista.visprestot.sql
| Vista de Presupuestos Totalizados por Cliente
| Visreppres

|-
| Viscompcnt
| [[FZG.Vista.viscompcnt.sql]]
| Vista resumen de Componentes completa con indicadores de estado de composición
| composicion, producto
|}</small>

=== Reportes ===
<small>
{| class="wikitable"
| <center>'''Nombre'''</center>
| <center>'''Comando'''</center>
| <center>'''Uso'''</center>
| <center>'''Observaciones'''</center>
|-
| Presupuesto
| <pre>
SELECT 
    visreppres.VidQuoteID,
    visreppres.VidQuoteObra,
    visreppres.VidQuoteCliente,
    visreppres.VidQuoteFecha,
    visreppres.VidQuoteItem,
    visreppres.VidQuoteProdCantidad,
    visreppres.VidQuoteProdID,
    visreppres.VidQuoteDetalle,
    visreppres.VidQuotePrecioS,
    clientes.RazonSocial,
    clientes.Direccion,
    clientes.Localidad,
    clientes.Provincia
FROM
    fzggestion.clientes AS clientes,
    fzggestion.visreppres AS visreppres
WHERE
    clientes.ClienteID = visreppres.VidQuoteCliente
ORDER BY 
    visreppres.VidQuoteID ASC ,
    visreppres.VidQuoteObra ASC ,
    visreppres.VidQuoteCliente ASC ,
    visreppres.VidQuoteItem ASC 
</pre>
| Reporte de Presupuesto Individual
| Filtra por Presupuesto. Visreppres
|-
| Productos
| <pre>SELECT 
    productos.ProductoID,
    productos.CategoriaID,
    productos.Descripcion,
    productos.Magnitud,
    productos.InsumoIMG
FROM
    fzggestion.productos productos
ORDER BY 
    productos.CategoriaID,
    productos.ProductoID</pre>
| Reporte de Productos
|-
| Listado de Precios Vigentes
| [[VISTA: visrepprec]]
| Reporte de Precios Vigentes
| 
|}
</small>

=== Procedimientos ===
<small>
{| class="wikitable"
| <center>'''Nombre'''</center>
| <center>'''Comando'''</center>
| <center>'''Uso'''</center>
| <center>'''Observaciones'''</center>
|-
| CrearNuevaListaPrecios
| FZG.Procedure.CrearNuevaListaPrecios.sql
| FORM: Crear Nueva Lista
| Agrega registración al tiempo de generar una nueva lista de precios.
|-
| DuplicaProductoCompo
| FZG.Procedure.DuplicaProductoCompo.sql
| FORM: Copia Composicion
| Copia las registraciones de un producto dentro de la tabla de composición con el atrubuto ProductoID diferente al original.
|-
| ActualizaPreciosTabular
| [[FZG.Procedure.ActualizaPreciosTabular.sql]]
| FORM: Actualiza Precios Tabular
| Cambio Masivo de Precios de acuerdo al criterio de búsqueda ingresado en el formulario
|}
</small>

=== ACL ===
# Verificar que la ODB esté registrada en el profile de LO/OO (el getcontext hace referencia a eso)
# Grabar con semilla de nombre de datasource con el texto -> "sdbc:mysql:odbc:''<datasource>''"
'''Ingreso de Registro en Tabla'''
<small><pre>
INSERT INTO wscontrol (
	wskey1,
	wskey2,
	wsKey3
	) 
VALUES(
	ENCODE(<MAC Address en minúscula sin separadores>,"sdbc:mysql:odbc:<datasource>"),
	ENCODE(<Cantidad de Usuarios en formato fill 0 de 3 dígitos>,"sdbc:mysql:odbc:<datasource>")
	ENCODE(<FechaLimite en ISO Format>,"sdbc:mysql:odbc:<datasource>")
	)
</pre></small>
'''Ejemplo'''
<small><pre>
INSERT INTO wscontrol (
	wskey1,
	wskey2,
	wsKey3
	) 
VALUES(
	ENCODE("e0cb4ec8dae3","sdbc:mysql:odbc:FazzGlassGestion"),
	ENCODE("005","sdbc:mysql:odbc:FazzGlassGestion"),
	ENCODE("20120531","sdbc:mysql:odbc:FazzGlassGestion")
	)
</pre></small>
'''Corroborar ACL'''
<small><pre>
SELECT
	wskey1 AS Cantidad,
	wskey2 AS Usuarios,
	wskey3 AS FechaLimite,
	CAST(DECODE(wskey1,'sdbc:mysql:odbc:FazzGlassGestion') AS Char(12)),
	CAST(DECODE(wskey2,'sdbc:mysql:odbc:FazzGlassGestion') AS Char(03)),
	CAST(DECODE(wskey3,'sdbc:mysql:odbc:FazzGlassGestion') AS Char(08))
FROM
	wscontrol
</pre></small>
{{tecla|Ctrl|A}}