{
===============================================================================
  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.1.4
  Fecha versión actual: 06-03-2004
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    20-10-2001    Cambiado el método 'FacturarPedido' para que compruebe antes
                  si ese pedido ya está facturado.

    20-10-2001    Se ha añadido la función 'DarSituación'.

    20-10-2001    Añadir la columna 'Nombre de almacén' a la lista de pedidos.

    21-10-2001    La sentencia UPDATE de pedidos tenía para persona de contacto
                  del proveedor y para persona de contacto del almacén la misma
                  variable host, por lo que al actualizar un pedido se ponia
                  el mismo nombre en los dos campos.

    02-11-2001    Se ha eliminado la columna FACTURADO por CODIGOFACTURA.

    10-11-2001    Se han eliminado las DB_KEYS.

    27-11-2001    Se han mejorado los procedimientos de devolver y recibir pedidos
                  obligando a que la situacion sea la idonea.

    27-11-2001    En la columna 'Unid. medida' aparece una lista desplegable.

    12-01-2002    Añadido el cliente final a los pedidos de proveedor.

    22-01-2002    Se han cambiado las SQL para que la columna PENDIENTES no
                  dependa directamente de CANTIDAD. Es para permitir modificar
                  un pedido parcialmente recibido.

    07-04-2002    Adaptar todas las funciones a la transacción única.

    05-05-2002    Adaptación al grid 'TdxDBGrid'.

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

    16-11-2002    p250. Poner el número total de pedidos dados de alta
                  en la inicialización del grid.

    08-04-2003    P263. Agrupar por años los pedidos, nueva función DarListaAnos.

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

unit TablaPedidosProveedor;

interface

uses
  SysUtils, classes, forms, IB, IBSQL, IBDatabase, BaseDatos, cxGrid,
  Contadores, cxEdit;

type
  TDatosPedidoProveedor = class(TPersistent)
  public
    CodigoEmpresa : Integer;
    Codigo : String;
    FechaAlta : String;
    FechaEmision : String;
    FechaRecepcion : String;
    Situacion : String;
    Usuario : String;
    Notas : String;
    CodigoProveedor : String;
    NifCif : String;
    Nombre : String;
    Fax : String;
    PersonaContacto : String;
    CodigoCliente : String;
    CodigoAlmacen : String;
    NombreAlmacen : String;
    CalleAlmacen : String;
    NumeroAlmacen : String;
    PisoAlmacen : String;
    CodigoPostalAlmacen : String;
    PoblacionAlmacen : String;
    ProvinciaAlmacen : String;
    PersonaContactoAlmacen : String;
    ImporteTotal : String;
    CodigoFactura : String;
  end;

  TDatosDetallePedidoProveedor = class(TPersistent)
  public
    CodigoEmpresa : Integer;
    CodigoPedido : String;
    NumConcepto : Integer;
    CodigoArticulo : String;
    Referencia : String;
    Descripcion : String;
    Cantidad : String;
    Precio : String;
    Descuento : String;
    Total : String;
    Pendientes : String;
  end;

  TdmTablaPedidosProveedor = class(TDataModule)
  private
    procedure IniciarSQLPedido;
    procedure IniciarSQLDetalles;
    procedure IniciarSQLGrids;
  public
    sqlInsertarPedido : TStrings;
    sqlModificarPedido : TStrings;
    sqlConsultarPedido : TStrings;
    sqlEliminarPedido : TStrings;
    sqlConsultarGridPedidos : TStrings;
    sqlConsultarGridPedidosProv : TStrings;
    sqlConsultarGridPedidosRecibir : TStrings;
    sqlConsultarGridPedidosDevolver : TStrings;
    sqlConsultarGridPedidosFacturar : TStrings;

    sqlInsertarDetalles : TStrings;
    sqlModificarDetalles : TStrings;
    sqlConsultarDetalles : TStrings;
    sqlEliminarDetalles : TStrings;
    sqlConsultarGridDetalles : TStrings;

    //Metodos que llamaran a contador
    function DarNuevoCodigo : String;
    function InsertarContador : boolean;
    function IncrementarCodigo : boolean;
    function ValidarCodigo(Codigo : String) : Boolean;
    function FormatearCodigo(Codigo : String) : String;

    function DarDatosPedido(Pedido: TDatosPedidoProveedor): Boolean;
    function ExisteCodigo(CodigoEmpresa: Integer; Codigo : String) : Boolean;
    function EmitirPedido(CodigoEmpresa : Integer; Codigo: String;
      FechaEmision: TDateTime): Boolean;
    function CancelarPedido(CodigoEmpresa : Integer; Codigo : String) : Boolean;
    function FacturarPedido(CodigoEmpresa : Integer; CodigoPedido,
      CodigoFactura: String) : boolean;
    function NoFacturarPedido(CodigoEmpresa : Integer; CodigoPedido: String) : boolean;
    function PedidoFacturado(CodigoEmpresa : Integer; CodigoPedido: String): boolean;
    function DevolverPedido(CodigoEmpresa : Integer; CodigoPedido, Fecha: String): boolean;
    function BloquearPedido(CodigoEmpresa : Integer; CodigoPedido, Fecha : String): boolean;
    function RecibirTotalmentePedido(CodigoEmpresa : Integer; CodigoPedido, Fecha : String): boolean;
    function RecibirParcialmentePedido(CodigoEmpresa : Integer; CodigoPedido, Fecha : String): boolean;
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
    procedure InicializarGridDetalles(var Grid: TcxGrid);
    procedure InicializarGridPedidos(var Grid: TcxGrid);
    procedure InicializarTablaPedidos(Tabla: TPTabla);
    procedure InicializarTablaDetalles(Tabla: TPTabla);
    function DarSituaciones : TStrings;

    function ModificarUnidadesPendientesArticulo(Datos : TDatosDetallePedidoProveedor): Boolean;
    function DarUnidadesPendientes(CodigoEmpresa: Integer; CodigoPedido: String): String;
    function DarSituacion(CodigoEmpresa: Integer; CodigoPedido : String) : String;
    function ExisteArticuloEnPedido(CodigoEmpresa: Integer; CodigoArticulo: String): Boolean;
    function ExisteAlmacenEnPedido(CodigoEmpresa: Integer; CodigoAlmacen: String;
      var CodigoPedido, Situacion : String): Boolean;
    function DarListaAnos(CodigoEmpresa : Integer): TStringList;    
  end;

var
  dmTablaPedidosProveedor: TdmTablaPedidosProveedor;

implementation

{$R *.DFM}

uses
  Mensajes, db, dbgrids, StrFunc, Excepciones, TablaUnidadesMedida,
  IBCustomDataSet, Constantes, Literales, cxGridDBTableView, cxCustomData, 
  RdxGestorContadores, cxGridCustomTableView, cxButtonEdit, cxDropDownEdit,
  cxSpinEdit;

constructor TdmTablaPedidosProveedor.Create (AOwner : TComponent);
begin
  inherited;
  { Cabecera }
  sqlInsertarPedido := TStringList.Create;
  sqlModificarPedido := TStringList.Create;
  sqlConsultarPedido := TStringList.Create;
  sqlEliminarPedido := TStringList.Create;

  { Detalles }
  sqlInsertarDetalles := TStringList.Create;
  sqlModificarDetalles := TStringList.Create;
  sqlConsultarDetalles := TStringList.Create;
  sqlEliminarDetalles := TStringList.Create;

  { Grids }
  sqlConsultarGridPedidos := TStringList.Create;
  sqlConsultarGridPedidosProv := TStringList.Create;
  sqlConsultarGridDetalles := TStringList.Create;
  sqlConsultarGridPedidosRecibir := TStringList.Create;
  sqlConsultarGridPedidosDevolver := TStringList.Create;
  sqlConsultarGridPedidosFacturar := TStringList.Create;

  IniciarSQLPedido;
  IniciarSQLDetalles;
  IniciarSQLGrids;
end;

destructor TdmTablaPedidosProveedor.Destroy;
begin
  { Cabecera }
  sqlInsertarPedido.Free;
  sqlModificarPedido.Free;
  sqlConsultarPedido.Free;
  sqlEliminarPedido.Free;

  { Detalles }
  sqlInsertarDetalles.Free;
  sqlModificarDetalles.Free;
  sqlConsultarDetalles.Free;
  sqlEliminarDetalles.Free;


  { Grids }
  sqlConsultarGridPedidos.Free;
  sqlConsultarGridPedidosProv.Free;
  sqlConsultarGridDetalles.Free;
  sqlConsultarGridPedidosRecibir.Free;
  sqlConsultarGridPedidosDevolver.Free;
  sqlConsultarGridPedidosFacturar.Free;
 
  inherited;
end;

procedure TdmTablaPedidosProveedor.IniciarSQLPedido;
begin
  with sqlInsertarPedido do
  begin
    Add('insert into PEDIDOSPROVEEDOR ');
    Add('(CODIGOEMPRESA, CODIGO, FECHAALTA, FECHAEMISION, FECHARECEPCION, ');
    Add('SITUACION, USUARIO, NOTAS, CODIGOPROVEEDOR, NIFCIF, ');
    Add('NOMBRE, FAX, PERSONACONTACTO, CODIGOCLIENTE, CODIGOALMACEN, ');
    Add('NOMBREALMACEN, CALLEALMACEN, NUMEROALMACEN, PISOALMACEN, ');
    Add('CODIGOPOSTALALMACEN, POBLACIONALMACEN, PROVINCIAALMACEN, ');
    Add('PERSONACONTACTOALMACEN, IMPORTETOTAL, ');
    Add('CODIGOOBRA, NOMBREOBRA) ');
    Add('values (:CODIGOEMPRESA, :CODIGO, :FECHAALTA, :FECHAEMISION, :FECHARECEPCION, ');
    Add(':SITUACION, :USUARIO, :NOTAS, :CODIGOPROVEEDOR, :NIFCIF, ');
    Add(':NOMBRE, :FAX, :PERSONACONTACTO, :CODIGOCLIENTE, :CODIGOALMACEN, ');
    Add(':NOMBREALMACEN, :CALLEALMACEN, :NUMEROALMACEN, :PISOALMACEN, ');
    Add(':CODIGOPOSTALALMACEN, :POBLACIONALMACEN, :PROVINCIAALMACEN, ');
    Add(':PERSONACONTACTOALMACEN, :IMPORTETOTAL, ');
    Add(':CODIGOOBRA, :NOMBREOBRA)');
  end;

  with sqlModificarPedido do
  begin
    Add('update PEDIDOSPROVEEDOR set ');
    Add('FECHAALTA = :FECHAALTA, ');
    Add('FECHAEMISION = :FECHAEMISION, ');
    Add('FECHARECEPCION = :FECHARECEPCION, ');
    Add('SITUACION = :SITUACION, ');
    Add('USUARIO = :USUARIO, ');
    Add('NOTAS = :NOTAS, ');
    Add('CODIGOPROVEEDOR = :CODIGOPROVEEDOR, ');
    Add('NIFCIF = :NIFCIF, ');
    Add('NOMBRE = :NOMBRE, ');
    Add('FAX = :FAX, ');
    Add('PERSONACONTACTO = :PERSONACONTACTO, ');
    Add('CODIGOCLIENTE = :CODIGOCLIENTE, ');
    Add('CODIGOALMACEN = :CODIGOALMACEN, ');
    Add('NOMBREALMACEN = :NOMBREALMACEN, ');
    Add('CALLEALMACEN = :CALLEALMACEN, ');
    Add('NUMEROALMACEN = :NUMEROALMACEN, ');
    Add('PISOALMACEN = :PISOALMACEN, ');
    Add('CODIGOPOSTALALMACEN = :CODIGOPOSTALALMACEN, ');
    Add('POBLACIONALMACEN = :POBLACIONALMACEN, ');
    Add('PROVINCIAALMACEN = :PROVINCIAALMACEN, ');
    Add('PERSONACONTACTOALMACEN = :PERSONACONTACTOALMACEN, ');
    Add('IMPORTETOTAL = :IMPORTETOTAL, ');
    Add('CODIGOOBRA = :CODIGOOBRA, ');
    Add('NOMBREOBRA = :NOMBREOBRA ');
    Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) and (CODIGO = :CODIGO)');
  end;

  with sqlEliminarPedido do
  begin
    Add('delete from PEDIDOSPROVEEDOR ');
    Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) and (CODIGO = :CODIGO)');
  end;

  with sqlConsultarPedido do
  begin
    Add('select * from PEDIDOSPROVEEDOR ');
    Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) and (CODIGO = :CODIGO)');
  end;
end;

procedure TdmTablaPedidosProveedor.IniciarSQLDetalles;
begin
  with sqlInsertarDetalles do
  begin
    Add('insert into DETALLESPEDIDOSPROVEEDOR ');
    Add('(CODIGOEMPRESA, CODIGOPEDIDO, NUMCONCEPTO, CODIGOARTICULO, REFERENCIA, DESCRIPCION, ');
    Add('CANTIDAD, UNIDADESMEDIDA, PRECIO, DESCUENTO, TOTAL, PENDIENTES) ');
    Add('values (:CODIGOEMPRESA, :CODIGOPEDIDO, :NUMCONCEPTO, :CODIGOARTICULO, :REFERENCIA, :DESCRIPCION, ');
    Add(':CANTIDAD, :UNIDADESMEDIDA, :PRECIO, :DESCUENTO, :TOTAL, :PENDIENTES)');
  end;

  with sqlModificarDetalles do
  begin
    Add('update DETALLESPEDIDOSPROVEEDOR set ');
    Add('CODIGOPEDIDO = :CODIGOPEDIDO, ');
    Add('NUMCONCEPTO = :NUMCONCEPTO, ');
    Add('CODIGOARTICULO = :CODIGOARTICULO, ');
    Add('REFERENCIA = :REFERENCIA, ');
    Add('DESCRIPCION = :DESCRIPCION, ');
    Add('CANTIDAD = :CANTIDAD, ');
    Add('UNIDADESMEDIDA = :UNIDADESMEDIDA, ');
    Add('PRECIO = :PRECIO, ');
    Add('DESCUENTO = :DESCUENTO, ');
    Add('TOTAL = :TOTAL, ');
    Add('PENDIENTES = :PENDIENTES ');
    Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) and (CODIGOPEDIDO = :CODIGOPEDIDO) and ');
    Add('(NUMCONCEPTO = :NUMCONCEPTO)');
  end;

  with sqlEliminarDetalles do
  begin
    Add('delete from DETALLESPEDIDOSPROVEEDOR ');
    Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) and (CODIGOPEDIDO = :CODIGOPEDIDO) and ');
    Add('(NUMCONCEPTO = :NUMCONCEPTO)');
  end;

  with sqlConsultarDetalles do
  begin
    Add('select CODIGOPEDIDO, NUMCONCEPTO, ');
    Add('CODIGOARTICULO, REFERENCIA, DESCRIPCION, CANTIDAD, PRECIO, ');
    Add('DESCUENTO, TOTAL, UNIDADESMEDIDA, PENDIENTES ');
    Add('from DETALLESPEDIDOSPROVEEDOR ');
    Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) and (CODIGOPEDIDO = :CODIGOPEDIDO) and ');
    Add('(NUMCONCEPTO = :NUMCONCEPTO)');
  end;
end;

function TdmTablaPedidosProveedor.DarNuevoCodigo : String;
begin
  Result := GestorContadores.DarNuevoCodigo(contPedidosProveedor);
end;

function TdmTablaPedidosProveedor.InsertarContador : boolean;
begin
  Result := GestorContadores.InsertarContador(contPedidosProveedor);
end;


function TdmTablaPedidosProveedor.IncrementarCodigo : Boolean;
begin
  Result := GestorContadores.IncrementarValor(contPedidosProveedor);
end;

function TdmTablaPedidosProveedor.ValidarCodigo(Codigo : String) : Boolean;
begin
  Result := GestorContadores.ValidarCodigo(contPedidosProveedor, Codigo);
end;

function TdmTablaPedidosProveedor.FormatearCodigo(Codigo : String) : String;
begin
  Result := GestorContadores.FormatearCodigo(contPedidosProveedor, Codigo);
end;

procedure TdmTablaPedidosProveedor.InicializarTablaPedidos(Tabla : TPTabla);
begin
  with Tabla^.Fields do
  begin
    if FindField('FECHAALTA') <> NIL then
      with (FieldByName('FECHAALTA') as TDateField) do begin
        EditMask := MASK_FECHA;
      end;

    if FindField('FECHAEMISION') <> NIL then
      with (FieldByName('FECHAEMISION') as TDateField) do begin
        EditMask := MASK_FECHA;
      end;

    if FindField('FECHARECEPCION') <> NIL then
      with (FieldByName('FECHARECEPCION') as TDateField) do begin
        EditMask := MASK_FECHA;
      end;

    if FindField('IMPORTETOTAL') <> NIL then
      //with (FieldByName('IMPORTETOTAL') as TFloatField) do begin
      with (FieldByName('IMPORTETOTAL') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
        DisplayLabel := 'Importe total';
      end;
  end;
end;

procedure TdmTablaPedidosProveedor.InicializarGridPedidos(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 := 'CODIGO';
    Columna.Caption := 'Código';
    Columna.Width := tamColCodigo;
    Columna.SortOrder := soDescending;
    Columna.Summary.FooterKind := skCount;
    Columna.Summary.FooterFormat := 'Total: 0 pedidos';

    {Columna ANO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'ANO';
    Columna.Caption := 'Año';
    Columna.Width := tamColFecha;
    Columna.Visible := False;

    {Columna SITUACION}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'SITUACION';
    Columna.Caption := 'Situación';
    Columna.Width := tamColSituacion;
    {Columna FECHAALTA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FECHAALTA';
    Columna.Caption := 'Fecha alta';
    Columna.Width := tamColFecha;
    {Columna NOMBRE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NOMBRE';
    Columna.Caption := 'Nombre';
    Columna.Width := tamColNombre;
    {Columna NOMBREALMACEN}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NOMBREALMACEN';
    Columna.Caption := 'Almacén';
    Columna.Width := tamColNombre;
    {Columna NOMBREOBRA}
{    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NOMBREOBRA';
    Columna.Caption := 'Cliente final';
    Columna.Width := tamColNombre;
    {Columna FECHAEMISION}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FECHAEMISION';
    Columna.Caption := 'Emisión';
    Columna.Width := tamColFecha;
    {Columna FECHARECEPCION}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FECHARECEPCION';
    Columna.Caption := 'Recepción';
    Columna.Width := tamColFecha;
    {Columna IMPORTETOTAL}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTETOTAL';
    Columna.Caption := 'Importe';
    Columna.Width := tamColImporte;
    {Columna CODIGOFACTURA}
{    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOFACTURA';
    Columna.Caption := 'Cód. factura';
    Columna.Width := tamColCodigo;
    {Columna NIFCIF}
{    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NIFCIF';
    Columna.Caption := 'NIF/CIF';
    Columna.Width := tamColNIFCIF;
    {Columna CODIGOPROVEEDOR}
{    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOPROVEEDOR';
    Columna.Caption := 'Cód. prov.';
    Columna.Width := tamColCodigo;}
  end;
end;

procedure TdmTablaPedidosProveedor.InicializarTablaDetalles(Tabla : TPTabla);
begin
  with Tabla^.Fields do
  begin
    with (FieldByName('PRECIO') as TFloatField) do begin
      DisplayFormat := DISPLAY_EUROS2;
      EditFormat := EDIT_EUROS2;
    end;
    with (FieldByName('DESCUENTO') as TFloatField) do begin
      DisplayFormat := DISPLAY_DTO;
      EditFormat := EDIT_DTO;
    end;
    with (FieldByName('TOTAL') as TFloatField) do begin
      DisplayFormat := DISPLAY_EUROS2;
      EditFormat := EDIT_EUROS2;
    end;
  end;
end;

procedure TdmTablaPedidosProveedor.InicializarGridDetalles(var Grid: TcxGrid);
var
  Columna : TcxGridDBColumn;
begin
  with (Grid.ActiveView as TcxGridDBTableView) do
  begin
    ClearItems;

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

    {Columna REFERENCIA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'REFERENCIA';
    Columna.Caption := 'Ref. proveedor';
    Columna.Width := tamColCodigo;
    {Columna DESCRIPCION}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'DESCRIPCION';
    Columna.Caption := 'Descripción material/servicio';
    Columna.Width := tamColDescripcion;
    Columna.PropertiesClassName := 'TcxButtonEditProperties';
    with TcxButtonEditProperties(Columna.Properties) do
    begin
      Buttons[0].Kind := bkEllipsis;
    end;

    {Columna CANTIDAD}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CANTIDAD';
    Columna.Caption := 'Cantidad';
    Columna.Width := tamColCantidad;
    Columna.PropertiesClassName := 'TcxSpinEditProperties';
    with TcxSpinEditProperties(Columna.Properties) do
    begin
      Alignment.Horz := taRightJustify;
    end;


    {Columna UNIDADESMEDIDA}
{    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'UNIDADESMEDIDA';
    Columna.Caption := 'Unid. medida';
    Columna.Width := tamColNombreCorto;
    Columna.PropertiesClassName := 'TcxComboBoxProperties';
    with TcxComboBoxProperties(Columna.Properties) do
    begin
      Items := dmTablaUnidadesMedida.DarUnidadesMedida;
    end;
}
    {Columna PENDIENTES}
    Columna := CreateColumn;
    Columna.Visible := False;
    Columna.DataBinding.FieldName := 'PENDIENTES';
    Columna.Width := tamColCantidad;

    {Columna PRECIO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'PRECIO';
    Columna.Caption := 'Precio unidad';
    Columna.Width := tamColImporte;

    {Columna DESCUENTO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'DESCUENTO';
    Columna.Caption := 'Dto (%)';
    Columna.Width := tamColPorcentaje;
    Columna.PropertiesClassName := 'TcxSpinEditProperties';
    with TcxSpinEditProperties(Columna.Properties) do
    begin
      Alignment.Horz := taRightJustify;
    end;

    {Columna TOTAL}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'TOTAL';
    Columna.Caption := 'Precio total';
    Columna.Width := tamColImporte;
    Columna.PropertiesClassName := 'TcxSpinEditProperties';
    with TcxSpinEditProperties(Columna.Properties) do
    begin
      Alignment.Horz := taRightJustify;
    end;
  end;
end;

function TdmTablaPedidosProveedor.ExisteCodigo(CodigoEmpresa : Integer; Codigo: String): Boolean;
var
  oSQL : TIBSQL;
  Contador : String;
begin
  Result := False;
  if EsCadenaVacia(Codigo) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGO ');
    SQL.Add('from PEDIDOSPROVEEDOR ');
    SQL.Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) and (CODIGO = :CODIGO)');
    ParamByName('CODIGO').AsString := Codigo;
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    try
      Prepare;
      ExecQuery;
      Contador := Fields[0].AsString;
      Result := (Codigo = Contador);
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaPedidosProveedor.EmitirPedido(CodigoEmpresa : Integer;
  Codigo: String; FechaEmision: TDateTime): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;
  if EsCadenaVacia(Codigo) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update PEDIDOSPROVEEDOR set ');
    SQL.Add('SITUACION = ''Emitido'', ');
    SQL.Add('FECHAEMISION = :FECHAEMISION ');
    SQL.Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) and (CODIGO = :CODIGO)');
    ParamByName('CODIGO').AsString := Codigo;
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    ParamByName('FECHAEMISION').AsDate := FechaEmision;
    try
      Prepare;
      ExecQuery;
      Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaPedidosProveedor.CancelarPedido(CodigoEmpresa : Integer; Codigo: String): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;
  if EsCadenaVacia(Codigo) then
    Exit;
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update PEDIDOSPROVEEDOR set ');
    SQL.Add('SITUACION = ''No emitido'', ');
    SQL.Add('FECHAEMISION = NULL ');
    SQL.Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) and (CODIGO = :CODIGO)');
    try
      ParamByName('CODIGO').AsString := Codigo;
      ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
      Prepare;
      ExecQuery;
      Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmTablaPedidosProveedor.IniciarSQLGrids;
begin
  with sqlConsultarGridPedidos do
  begin
    Add('select CODIGO, SITUACION, FECHAALTA,  ');
    Add('EXTRACT (YEAR FROM FECHAALTA) as ANO, ');
    Add('NOMBRE, NOMBREALMACEN, NOMBREOBRA, FECHAEMISION, FECHARECEPCION,  ');
    Add('IMPORTETOTAL, CODIGOFACTURA, CODIGOPROVEEDOR, NIFCIF ');
    Add('from PEDIDOSPROVEEDOR ');
    Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    Add('order by CODIGO');
  end;

  with sqlConsultarGridPedidosProv do
  begin
    Add('select CODIGO, SITUACION, FECHAALTA, CODIGOPROVEEDOR, NIFCIF, ');
    Add('EXTRACT (YEAR FROM FECHAALTA) as ANO, ');
    Add('NOMBRE, FECHAEMISION, FECHARECEPCION, NOMBREALMACEN, ');
    Add('NOMBREOBRA, IMPORTETOTAL, CODIGOFACTURA ');
    Add('from PEDIDOSPROVEEDOR ');
    Add('where (CODIGOPROVEEDOR = :CODIGOPROVEEDOR) ');
    Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    Add('order by CODIGO');
  end;

  with sqlConsultarGridPedidosRecibir do
  begin
    Add('select CODIGO, SITUACION, FECHAALTA, CODIGOPROVEEDOR, NIFCIF, ');
    Add('EXTRACT (YEAR FROM FECHAALTA) as ANO, ');
    Add('NOMBRE, FECHAEMISION, FECHARECEPCION, NOMBREALMACEN, ');
    Add('NOMBREOBRA, IMPORTETOTAL, CODIGOFACTURA ');
    Add('from PEDIDOSPROVEEDOR ');
    Add('where UPPER(SITUACION) IN (''EMITIDO'', ''PARCIALMENTE RECIBIDO'') ');
    Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    Add('order by CODIGO');
  end;

  with sqlConsultarGridPedidosDevolver do
  begin
    Add('select CODIGO, SITUACION, FECHAALTA, CODIGOPROVEEDOR, NIFCIF, ');
    Add('EXTRACT (YEAR FROM FECHAALTA) as ANO, ');
    Add('NOMBRE, FECHAEMISION, FECHARECEPCION, NOMBREALMACEN, ');
    Add('NOMBREOBRA, IMPORTETOTAL, CODIGOFACTURA ');
    Add('from PEDIDOSPROVEEDOR ');
    Add('where UPPER(SITUACION) = ''TOTALMENTE RECIBIDO'' ');
    Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    Add('order by CODIGO');
  end;

  with sqlConsultarGridPedidosFacturar do
  begin
    Add('select CODIGO, SITUACION, FECHAALTA, CODIGOPROVEEDOR, NIFCIF, ');
    Add('EXTRACT (YEAR FROM FECHAALTA) as ANO, ');
    Add('NOMBRE, FECHAEMISION, FECHARECEPCION, NOMBREALMACEN, ');
    Add('NOMBREOBRA, IMPORTETOTAL, CODIGOFACTURA ');
    Add('from PEDIDOSPROVEEDOR ');
    Add('where (CODIGOFACTURA is NULL) and ');
    Add('(UPPER(SITUACION) IN (''TOTALMENTE RECIBIDO'', ''DEVUELTO'')) and ');
    Add('(CODIGOPROVEEDOR = :CODIGOPROVEEDOR) ');
    Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    Add('order by CODIGO');
  end;

  with sqlConsultarGridDetalles do
  begin
    Add('select CODIGOEMPRESA, CODIGOPEDIDO, NUMCONCEPTO, ');
    Add('CODIGOARTICULO, REFERENCIA, DESCRIPCION, ');
    Add('CANTIDAD, PRECIO, DESCUENTO, TOTAL, UNIDADESMEDIDA, PENDIENTES ');
    Add('from DETALLESPEDIDOSPROVEEDOR ');
    Add('where CODIGOPEDIDO = :CODIGOPEDIDO ');
    Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    Add('order by NUMCONCEPTO');
  end;
end;

function TdmTablaPedidosProveedor.DarDatosPedido(Pedido: TDatosPedidoProveedor): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;
  if EsCadenaVacia(Pedido.Codigo) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select * from PEDIDOSPROVEEDOR ');
    SQL.Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) and (CODIGO = :CODIGO)');
    try
      ParamByName('CODIGO').AsString := Pedido.Codigo;
      ParamByName('CODIGOEMPRESA').AsInteger := Pedido.CodigoEmpresa;
      Prepare;
      ExecQuery;

      //Compruebo que el codigo de almacen existe si no existe devuelvo false
      if (RecordCount > 0) then
      begin
        with Pedido do
        begin
          FechaAlta := FieldByName('FECHAALTA').AsString;
          FechaEmision := FieldByName('FECHAEMISION').AsString;
          FechaRecepcion := FieldByName('FECHARECEPCION').AsString;
          Situacion := FieldByName('SITUACION').AsString;
          Usuario:= FieldByName('USUARIO').AsString;
          Notas := FieldByName('NOTAS').AsString;
          CodigoProveedor := FieldByName('CODIGOPROVEEDOR').AsString;
          NifCif := FieldByName('NIFCIF').AsString;
          Nombre := FieldByName('NOMBRE').AsString;
          Fax := FieldByName('FAX').AsString;
          PersonaContacto := FieldByName('PERSONACONTACTO').AsString;
          CodigoCliente := FieldByName('CODIGOCLIENTE').AsString;
          CodigoAlmacen := FieldByName('CODIGOALMACEN').AsString;
          NombreAlmacen := FieldByName('NOMBREALMACEN').AsString;
          CalleAlmacen := FieldByName('CALLEALMACEN').AsString;
          NumeroAlmacen := FieldByName('NUMEROALMACEN').AsString;
          PisoAlmacen := FieldByName('PISOALMACEN').AsString;
          CodigoPostalAlmacen := FieldByName('CODIGOPOSTALALMACEN').AsString;
          PoblacionAlmacen := FieldByName('POBLACIONALMACEN').AsString;
          ProvinciaAlmacen := FieldByName('PROVINCIAALMACEN').AsString;
          PersonaContactoAlmacen := FieldByName('PERSONACONTACTOALMACEN').AsString;
          ImporteTotal := FieldByName('IMPORTETOTAL').AsString;
          CodigoFactura := FieldByName('CODIGOFACTURA').AsString;
          Result := True;
        end;
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;


function TdmTablaPedidosProveedor.DarSituaciones: TStrings;
var
  oSQL : TIBSQL;
  Lista : TStringList;
begin
  Result := NIL;
  oSQL := TIBSQL.Create(Self);
  Lista := TStringList.Create;
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select DESCRIPCION from SITUPEDIDOS');
    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 TdmTablaPedidosProveedor.ModificarUnidadesPendientesArticulo(Datos: TDatosDetallePedidoProveedor): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update DETALLESPEDIDOSPROVEEDOR ');
    SQL.Add('set PENDIENTES = PENDIENTES - :CANTIDAD ');
    SQL.Add('where CODIGOPEDIDO = :CODIGOPEDIDO ');
    SQL.Add('and CODIGOEMPRESA = :CODIGOEMPRESA ');
    SQL.Add('and NUMCONCEPTO = :NUMCONCEPTO ');
    SQL.Add('and (PENDIENTES - :CANTIDAD) >= 0 ');
    ParamByName('CANTIDAD').AsFloat := StrToFloat(Datos.Cantidad);
    ParamByName('CODIGOPEDIDO').AsString := Datos.CodigoPedido;
    ParamByName('CODIGOEMPRESA').AsInteger := Datos.CodigoEmpresa;
    ParamByName('NUMCONCEPTO').AsInteger := Datos.NumConcepto;
    try
      Prepare;
      ExecQuery;
      if RowsAffected <> 0 then
        Result := True
      else
        raise Exception.Create(msgPedidoYaRecibido);
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaPedidosProveedor.DarUnidadesPendientes(CodigoEmpresa: Integer;
  CodigoPedido: String): String;
var
  oSQL : TIBSQL;
begin
  Result := '-1';

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select sum(PENDIENTES) ');
    SQL.Add('from DETALLESPEDIDOSPROVEEDOR ');
    SQL.Add('where CODIGOPEDIDO = :CODIGOPEDIDO ');
    SQL.Add('and CODIGOEMPRESA = :CODIGOEMPRESA ');
    try
      ParamByName('CODIGOPEDIDO').AsString := CodigoPedido;
      ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
      Prepare;
      ExecQuery;
      Result := Fields[0].AsString;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;


function TdmTablaPedidosProveedor.ExisteArticuloEnPedido(CodigoEmpresa: Integer; CodigoArticulo: String): Boolean;
{Comprueba si existe un articulo en un determinado almacen, pasandole por
 parametro el codigo de articulo y el del almacen, devuelve true o false
 dependiendo si existe o no}
var
  oSQL : TIBSQL;
  Codigo : String;
begin
  Result := False;
  if (Length(Trim(CodigoArticulo)) = 0) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select distinct DET.CODIGOARTICULO ');
    SQL.Add('from PEDIDOSPROVEEDOR PED, DETALLESPEDIDOSPROVEEDOR DET');
    SQL.Add('where DET.CODIGOARTICULO = :CODIGOARTICULO ');
    SQL.Add('and DET.CODIGOEMPRESA = :CODIGOEMPRESA ');
    SQL.Add('and PED.CODIGOEMPRESA = DET.CODIGOEMPRESA ');
    SQL.Add('and PED.CODIGO = DET.CODIGOPEDIDO ');
    SQL.Add('and UPPER(PED.SITUACION) IN (''NO EMITIDO'',''EMITIDO'',''PARCIALMENTE RECIBIDO'') ');
    ParamByName('CODIGOARTICULO').AsString := CodigoArticulo;
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    try
      Prepare;
      ExecQuery;

      if (RecordCount = 0) then
        Result := False;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaPedidosProveedor.FacturarPedido(CodigoEmpresa : Integer; CodigoPedido, CodigoFactura: String) : boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update PEDIDOSPROVEEDOR set ');
    SQL.Add('CODIGOFACTURA = :CODIGOFACTURA');
    SQL.Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) and (CODIGO = :CODIGO) ');
    SQL.Add('and (CODIGOFACTURA is NULL) ');
    ParamByName('CODIGO').AsString := CodigoPedido;
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    ParamByName('CODIGOFACTURA').AsString := CodigoFactura;
    try
      Prepare;
      ExecQuery;
      Result := RowsAffected > 0;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaPedidosProveedor.NoFacturarPedido(CodigoEmpresa : Integer; CodigoPedido: String): boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;
  if (Length(Trim(CodigoPedido)) = 0) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update PEDIDOSPROVEEDOR set ');
    SQL.Add('CODIGOFACTURA = NULL');
    SQL.Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) and (CODIGO = :CODIGO) ');
    ParamByName('CODIGO').AsString := CodigoPedido;
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    try
      Prepare;
      ExecQuery;
      Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaPedidosProveedor.ExisteAlmacenEnPedido(CodigoEmpresa: Integer;
  CodigoAlmacen: String; var CodigoPedido, Situacion : String): Boolean;
{Comprueba si existe un almacen en un determinado pedido, pasandole por
 parametro el codigo de almacen, devuelve true o false dependiendo
 si existe o no}
var
  oSQL : TIBSQL;
  Codigo : String;
begin
  Result := False;
  Codigo := Trim(CodigoAlmacen);
  if (Length(Codigo) = 0) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGO, SITUACION ');
    SQL.Add('from PEDIDOSPROVEEDOR ');
    SQL.Add('where (CODIGOALMACEN = :CODIGOALMACEN) ');
    SQL.Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    SQL.Add('and (UPPER(SITUACION) NOT IN (''DEVUELTO''))');
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    ParamByName('CODIGOALMACEN').AsString := Codigo;
    try
      Prepare;
      ExecQuery;
      if (RecordCount <> 0) then
      begin
        CodigoPedido := FieldByName('CODIGO').AsString;
        Situacion := FieldByName('SITUACION').AsString;
        Result := True
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaPedidosProveedor.DarSituacion(CodigoEmpresa: Integer; CodigoPedido: String): String;
var
  oSQL : TIBSQL;
begin
  Result := '';

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select SITUACION ');
    SQL.Add('from PEDIDOSPROVEEDOR ');
    SQL.Add('where CODIGO = :CODIGOPEDIDO');
    SQL.Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    ParamByName('CODIGOPEDIDO').AsString := CodigoPedido;
    try
      Prepare;
      ExecQuery;
      Result := UpperCase(FieldByName('SITUACION').AsString);
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaPedidosProveedor.DevolverPedido(CodigoEmpresa : Integer;
  CodigoPedido, Fecha: String): boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update PEDIDOSPROVEEDOR ');
    SQL.Add('set SITUACION = ''Devuelto'', ');
    SQL.Add('FECHADEVOLUCION = :FECHADEVOLUCION ');
    SQL.Add('where CODIGO = :CODIGO ');
    SQL.Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    SQL.Add('and (UPPER(SITUACION) = ''TOTALMENTE RECIBIDO'') ');
    ParamByName('CODIGO').AsString := CodigoPedido;
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    ParamByName('FECHADEVOLUCION').AsString := Fecha;
    try
      Prepare;
      ExecQuery;
      if RowsAffected <> 0 then
        Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaPedidosProveedor.RecibirParcialmentePedido(CodigoEmpresa : Integer;
  CodigoPedido, Fecha: String): boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update PEDIDOSPROVEEDOR ');
    SQL.Add('set SITUACION = ''Parcialmente recibido'', ');
    SQL.Add('FECHARECEPCION = :FECHARECEPCION ');
    SQL.Add('where CODIGO = :CODIGO ');
    SQL.Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    SQL.Add('and (UPPER(SITUACION) in (''EMITIDO'', ''PARCIALMENTE RECIBIDO''))');
    ParamByName('FECHARECEPCION').AsString := Fecha;
    ParamByName('CODIGO').AsString := CodigoPedido;
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    try
      Prepare;
      ExecQuery;
      if RowsAffected <> 0 then
        Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaPedidosProveedor.RecibirTotalmentePedido(CodigoEmpresa : Integer;
  CodigoPedido, Fecha: String): boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update PEDIDOSPROVEEDOR ');
    SQL.Add('set SITUACION = ''Totalmente recibido'', ');
    SQL.Add('FECHARECEPCION = :FECHARECEPCION ');
    SQL.Add('where (CODIGO = :CODIGO) ');
    SQL.Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    SQL.Add('and (UPPER(SITUACION) in (''EMITIDO'',''PARCIALMENTE RECIBIDO''))');
    ParamByName('FECHARECEPCION').AsString := Fecha;
    ParamByName('CODIGO').AsString := CodigoPedido;
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    try
      Prepare;
      ExecQuery;
      if RowsAffected <> 0 then
        Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaPedidosProveedor.BloquearPedido(CodigoEmpresa : Integer;
  CodigoPedido, Fecha: String): boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update PEDIDOSPROVEEDOR ');
    SQL.Add('set FECHARECEPCION = :FECHARECEPCION ');
    SQL.Add('where (CODIGO = :CODIGO) ');
    SQL.Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    SQL.Add('and (UPPER(SITUACION) in (''EMITIDO'',''PARCIALMENTE RECIBIDO'',''TOTALMENTE RECIBIDO''))');
    ParamByName('CODIGO').AsString := CodigoPedido;
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    ParamByName('FECHARECEPCION').AsString := Fecha;
    try
      Prepare;
      ExecQuery;
      if RowsAffected <> 0 then
        Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaPedidosProveedor.PedidoFacturado(CodigoEmpresa : Integer;
  CodigoPedido: String): boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGOFACTURA ');
    SQL.Add('from PEDIDOSPROVEEDOR ');
    SQL.Add('where (CODIGO = :CODIGO) and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    ParamByName('CODIGO').AsString := CodigoPedido;
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    try
      Prepare;
      ExecQuery;
      Result := not EsCadenaVacia(FieldByName('CODIGOFACTURA').AsString);
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaPedidosProveedor.DarListaAnos(CodigoEmpresa : Integer): TStringList;
var
  oSQL : TIBSQL;
  Lista : TStringList;
begin
  Lista := TStringList.Create;
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select distinct (EXTRACT (YEAR FROM FECHAALTA)) ANO ');
    SQL.Add('from PEDIDOSPROVEEDOR ');
    SQL.Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    SQL.Add('order by FECHAALTA desc');
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    try
      Prepare;
      ExecQuery;
      Lista.Add(CTE_TODOS);
      while not EOF do begin
        Lista.Add(Fields[0].AsString);
        Next;
      end;
      result := Lista;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

end.

