{
===============================================================================
  Copyright (©) 2001. Rodax Software.
===============================================================================
  Los contenidos de este fichero son propiedad de Rodax Software titular del
  copyright. Este fichero sólo podrá ser copiado, distribuido y utilizado,
  en su totalidad o en parte, con el permiso escrito de Rodax Software, o de
  acuerdo con los términos y condiciones establecidas en el acuerdo/contrato
  bajo el que se suministra.
  -----------------------------------------------------------------------------
  Web:  www.rodax-software.com
===============================================================================
  Fecha primera versión: 01-10-2001
  Versión actual: 1.0.4
  Fecha versión actual: 06-03-2004
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    07-04-2002    Cambio de todos los procedimientos en los que se utiliza
                  una transaccion nueva, por una unica transacción.

                  Se han eliminado las funciones que utilizaban transacciones
                  por parametro DarNuevoCodigo, InsertarContador,
                  IncrementarCodigo.

    09-05-2002    Cambio de grid en lugar de utilizar UltimDBGrid, utilizaremos
                  dxDBGrid.

    27-05-2002    Cambio a un objeto contador (TContadorMovimiento)

    06-03-2004    P272. Adaptación a multiempresa.    
===============================================================================
}

unit TablaMovimientos;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms,
  Dialogs, DBTables, DB, IBCustomDataSet, IBSQL, BaseDatos, IBDatabase,
  Mensajes, IB, dbgrids, StrFunc, cxGrid,  
  Contadores;

type
  TDatosMovimiento = class(TPersistent)
  public
    Codigo : String;
    CodigoAlmacen : Integer;
    CodigoArticulo : String;
    NombreAlmacen : String;
    DescripcionArticulo : String;
    Familia : String;
    Unidades : String;
    TipoOperacion : String;
    TipoMovimiento : String;
    Cantidad : String;
    StockNuevo : String;
    StockAntiguo : String;
    Fecha : String;
    Hora : String;
    Usuario : String;
    Causa : String;
    NombreCliente : String;
  end;

type
  TdmTablaMovimientos = class(TDataModule)
  private
    procedure IniciarSQL;
  public
    sqlConsultarDetalles : TStrings;
    sqlConsultarPedido : TStrings;

    //Metodos que llamaran a contador
    function DarNuevoCodigo : String;
    function InsertarContador : boolean;
    function IncrementarCodigo : boolean;

    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;

    function DarTiposMovimientos: TStrings;
    function InsertarMovimiento(Datos: TDatosMovimiento): Boolean;
    procedure InicializarGridDetalles(var Grid: TcxGrid);
  end;
var
  dmTablaMovimientos: TdmTablaMovimientos;

implementation
{$R *.DFM}

uses
  Excepciones, RdxGestorContadores, RdxEmpresaActiva, cxGridDBTableView,
  cxButtonEdit, cxEdit;

constructor TdmTablaMovimientos.Create(AOwner: TComponent);
begin
  inherited;
  sqlConsultarDetalles := TStringList.Create;
  sqlConsultarPedido := TStringList.Create;

  IniciarSQL;
end;

destructor TdmTablaMovimientos.Destroy;
begin
  sqlConsultarDetalles.Free;
  sqlConsultarPedido.Free;
  inherited;
end;

procedure TdmTablaMovimientos.IniciarSQL;
begin
  with sqlConsultarDetalles do
  begin
    Add('select DPEDPROV.CODIGOPEDIDO, DPEDPROV.CODIGOARTICULO, ART.FAMILIA, ');
    Add('DPEDPROV.DESCRIPCION, DPEDPROV.UNIDADESMEDIDA, DESTALM.EXISTENCIAS, ');
    Add('DPEDPROV.CANTIDAD, DESTALM.STOCKMIN, DESTALM.STOCKMAX, DPEDPROV.PENDIENTES, DPEDPROV.NUMCONCEPTO, ');
    Add('DPEDPROV.PRECIO, DESTALM.PRECIORECEPCION, DESTALM.FECHARECEPCION');
    Add('from DETALLESPEDIDOSPROVEEDOR DPEDPROV, ESTADOALMACEN DESTALM, ARTICULOS ART ');
    Add('where 1 = 2');
  end;

  with sqlConsultarPedido do
  begin
    Add('select CODIGO, NOMBRE, NIFCIF, CODIGOALMACEN, FECHARECEPCION ');
    Add('from PEDIDOSPROVEEDOR ');
    Add('where (CODIGO = :CODIGO) and ');
    Add('(CODIGOEMPRESA = :CODIGOEMPRESA)');
  end;
end;

procedure TdmTablaMovimientos.InicializarGridDetalles(var Grid: TcxGrid);
var
  Columna : TcxGridDBColumn;
begin
  with (Grid.ActiveView as TcxGridDBTableView) do
  begin
    ClearItems;
    OptionsView.Footer := True;
    {Columna CODIGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOPEDIDO';
    Columna.Visible := False;

    {Columna CODIGOARTICULO}
    Columna.DataBinding.FieldName := 'CODIGOARTICULO';
    Columna.Caption := 'Cód. material';
    Columna.Width := tamColCodigo;
    Columna.Visible := True;
    Columna.PropertiesClassName := 'TcxButtonEditProperties';
    with TcxButtonEditProperties(Columna.Properties) do
    begin
      Buttons[0].Kind := bkEllipsis;
    end;

    {Columna FAMILIA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FAMILIA';
    Columna.Visible := False;
    {Columna DESCRIPCION}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'DESCRIPCION';
    Columna.Caption := 'Descripción de material';
    Columna.Width := tamColDescripcion;
    {Columna UNIDADES}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'UNIDADESMEDIDA';
    Columna.Visible := False;
    {Columna EXISTENCIAS}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'EXISTENCIAS';
    Columna.Caption := 'Existencias';
    Columna.Width := tamColCantidad;
    {Columna CANTIDAD}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CANTIDAD';
    Columna.Caption := 'Cantidad';
    Columna.Width := tamColCantidad;
    {Columna STOCKMIN}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'STOCKMIN';
    Columna.Caption := 'Stock mínimo';
    Columna.Width := tamColCantidad;
    {Columna STOCKMAX}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'STOCKMAX';
    Columna.Caption := 'Stock máximo';
    Columna.Width := tamColCantidad;
    {Columna PENDIENTES}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'PENDIENTES';
    Columna.Visible := False;
    {Columna NUMCONCEPTO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NUMCONCEPTO';
    Columna.Visible := False;

    {Columna PRECIO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'PRECIO';
    Columna.Caption := 'Precio';
    Columna.Visible := False;
    {Columna PRECIORECEPCION}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'PRECIORECEPCION';
    Columna.Caption := 'Precio recepcion';
    Columna.Visible := False;
    {Columna FECHARECEPCION}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FECHARECEPCION';
    Columna.Caption := 'Fecha recepcion';
    Columna.Visible := False;
  end;
end;

function TdmTablaMovimientos.insertarMovimiento(Datos: TDatosMovimiento): Boolean;
{Inserta el articulo dado por parametro en la tabla EstadoAlmacen si algo sale
 mal devuelve false}
var
  oSQL : TIBSQL;
begin
  Result := False;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('insert into MOVIMIENTOS ');
    SQL.Add('(CODIGO, CODIGOEMPRESA, CODIGOALMACEN, CODIGOARTICULO, NOMBREALMACEN, DESCRIPCIONARTICULO, ');
    SQL.Add('FAMILIA, UNIDADES, TIPOOPERACION, TIPOMOVIMIENTO, CANTIDAD, STOCKNUEVO, ');
    SQL.Add('STOCKANTIGUO, FECHA, HORA, USUARIO, CAUSA, NOMBRECLIENTE) ');
    SQL.Add('values (:CODIGO, :CODIGOEMPRESA, :CODIGOALMACEN, :CODIGOARTICULO, :NOMBREALMACEN, ');
    SQL.Add(':DESCRIPCIONARTICULO, :FAMILIA, :UNIDADES, :TIPOOPERACION, ');
    SQL.Add(':TIPOMOVIMIENTO, :CANTIDAD, :STOCKNUEVO, :STOCKANTIGUO, CURRENT_DATE, ');
    SQL.Add('CURRENT_TIME, USER, :CAUSA, :NOMBRECLIENTE)');

  try
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    ParamByName('CODIGO').AsString := Datos.Codigo;
    ParamByName('CODIGOALMACEN').AsInteger := Datos.CodigoAlmacen;
    ParamByName('CODIGOARTICULO').AsString := Datos.CodigoArticulo;
    ParamByName('NOMBREALMACEN').AsString := Datos.NombreAlmacen;
    ParamByName('DESCRIPCIONARTICULO').AsString := Datos.DescripcionArticulo;
    ParamByName('FAMILIA').AsString := Datos.Familia;
    ParamByName('UNIDADES').AsString := Datos.Unidades;
    ParamByName('TIPOOPERACION').AsString := Datos.TipoOperacion;
    ParamByName('TIPOMOVIMIENTO').AsString := Datos.TipoMovimiento;
    ParamByName('CANTIDAD').AsFloat := StrToFloat(Datos.Cantidad);
    ParamByName('STOCKNUEVO').AsFloat := StrToFloat(Datos.StockNuevo);
    ParamByName('STOCKANTIGUO').AsFloat := StrToFloat(Datos.StockAntiguo);
    ParamByName('CAUSA').AsString := Datos.Causa;
    ParamByName('NOMBRECLIENTE').AsString := Datos.NombreCliente;
    Prepare;
    ExecQuery;
    Result := True;
  finally
    Close;
    Transaction := NIL;
    Free;
  end;
  end;
end;

function TdmTablaMovimientos.DarNuevoCodigo: String;
begin
  Result := GestorContadores.DarNuevoCodigo(contMovimientos);
end;

function TdmTablaMovimientos.InsertarContador: boolean;
begin
  Result := GestorContadores.InsertarContador(contMovimientos);
end;

function TdmTablaMovimientos.darTiposMovimientos: TStrings;
var
  oSQL : TIBSQL;
  Lista : TStringList;
begin
  oSQL := TIBSQL.Create(Self);
  Lista := TStringList.Create;

  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select DESCRIPCION from TIPOSMOVIMIENTOS');

  try
    Prepare;
    ExecQuery;
    while not EOF do begin
      Lista.Append(Fields[0].AsString);
      Next;
    end;
    Result := Lista;
  finally
    Close;
    Transaction := NIL;
    Free;
  end;
  end;
end;

function TdmTablaMovimientos.IncrementarCodigo: Boolean;
begin
  Result := GestorContadores.IncrementarValor(contMovimientos);
end;

end.
