{
===============================================================================
  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.2
  Fecha versión actual: 18-03-2005
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    09-10-2001    Al pulsar la tecla ESC se activa el botón 'Cancelar'. Sólo
                  pasa cuando este frame está en una ventana modal.

    29-10-2001    Hacer más grande la ventana modal para facturar un
                  presupuesto.

    31-10-2001    Solamente se debe permitir modificar presupuestos que estén
                  pendientes.

    31-10-2001    Solamente se debe permitir eliminar presupuestos que estén
                  pendientes.

    01-11-2001    Se ha eliminado el botón de 'Documento relacionados'.

    13-01-2002    Se han coloreado las filas del grid dependiendo de la
                  situación del presupuesto.

    07-04-2002    Se ha adaptado para la transacción única.

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

    08-05-2002    P217. Permitir que se modifique un presupuesto 'aceptado'
                  o 'anulado'.

    11-05-2002    P215. Copia de presupuestos.

    11-08-2002    P231. Listado de presupuestos de un determinado cliente.

    08-04-2003    P263. Agrupar por años los presupuestos.

    21-04-2003    P266. Contemplar la situación 'EN EJECUCIÓN' para los presupuestos de cliente.
                  Deberemos eliminar el boton Anular presupuesto y todo su codigo, y modificar la
                  apariencia del botón Aceptar presupuesto.

    08-03-2004    Al hacer doble click sobre el grid, se pasará a modificar el
                  registro o se seleccionará, dependiendo del modo en el que
                  se encuentre la pantalla.

    08-03-2004    p272. Adaptación a multiempresa.

    02-02-2005    p550. Nueva funcionalidad de enviar correo bEnviarCorreoClick

    18-03-2005    p587. Adaptación a Bonificaciones    
===============================================================================
}

unit PresupuestosClientes;

interface

uses
  Windows, Db, Menus, am2000menuitem, am2000popupmenu, am2000, RdxBarras,
  RdxBotones, Grids, DBGrids, RXDBCtrl, Classes, Controls, RdxFrame, 
  ExtCtrls, RdxPaneles, RdxFramePresupuestos, Tipos, Dialogs,
  RdxDialogos, dxCntner, dxTL, dxDBCtrl, dxDBGrid, Graphics, StdCtrls,
  RdxComboBox, am2000utils;


type
  TfrPresupuestosClientes = class(TRdxFramePresupuestos)
    pnlCuerpo: TRdxPanel;
    pnlGrid: TRdxPanel;
    pnlSuperior: TRdxBarraSuperior;
    bModificar: TRdxBotonSuperior;
    bEliminar: TRdxBotonSuperior;
    bConsultar: TRdxBotonSuperior;
    bBuscar: TRdxBotonSuperior;
    dsPresupuestos: TDataSource;
    brSeleccion: TRdxBarraInferior;
    bSeleccionar: TRdxBoton;
    bCancelarGuardar: TRdxBoton;
    brSimple: TRdxBarraInferior;
    bSalir: TRdxBoton;
    pnlExtra: TRdxBarraSuperior;
    bAceptar: TRdxBoton;
    bAnular: TRdxBoton;
    bFacturar: TRdxBoton;
    bImprimir: TRdxBoton;
    gridPresupuestos: TdxDBGrid;
    bAnadir: TRdxBotonMenu;
    menuAnadir: TPopupMenu2000;
    mnNuevo: TMenuItem2000;
    MenuItem20004: TMenuItem2000;
    mnCopiar: TMenuItem2000;
    bListar: TRdxBotonMenu;
    menuListar: TPopupMenu2000;
    Listadepresupuestosdecliente1: TMenuItem2000;
    imgSombra: TImage;
    RdxPanel1: TRdxPanel;
    cbxAno: TRdxComboBox;
    Label1: TLabel;
    bExportar: TRdxBoton;
    bEnviarCorreo: TRdxBoton;
    procedure bAnadirClick(Sender: TObject);
    procedure bSeleccionarClick(Sender: TObject);
    procedure bCancelarGuardarClick(Sender: TObject);
    procedure bSalirClick(Sender: TObject);
    procedure bModificarClick(Sender: TObject);
    procedure bEliminarClick(Sender: TObject);
    procedure bConsultarClick(Sender: TObject);
    procedure bExportarClick(Sender: TObject);
    procedure bAceptarClick(Sender: TObject);
    procedure bAnularClick(Sender: TObject);
    procedure bFacturarClick(Sender: TObject);
    procedure bBuscarClick(Sender: TObject);
    procedure bImprimirClick(Sender: TObject);
    procedure gridPresupuestosRefreshButton(Sender: TObject);
    procedure gridPresupuestosCustomDrawCell(Sender: TObject;
      ACanvas: TCanvas; ARect: TRect; ANode: TdxTreeListNode;
      AColumn: TdxTreeListColumn; ASelected, AFocused,
      ANewItemRow: Boolean; var AText: String; var AColor: TColor;
      AFont: TFont; var AAlignment: TAlignment; var ADone: Boolean);
    procedure bCopiarClick(Sender: TObject);
    procedure Listadepresupuestosdecliente1Click(Sender: TObject);
    procedure cbxAnoChange(Sender: TObject);
    procedure gridPresupuestosDblClick(Sender: TObject);
    procedure bEnviarCorreoClick(Sender: TObject);
  private
    FCodigoCliente : string;
    procedure SetCodigoCliente (Value : string);
    procedure ActualizarBotones;
  protected
    procedure FreeContenido; override;
    procedure BuscarPresupuesto; override;
    procedure VerModal; override;
    procedure SetContenido (NuevoFrame : TRdxFrame); override;
    procedure CambiarModo(ModoAnterior, Modo : TRdxModo); override;
    procedure ActualizarBarras; override;
  public
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  published
    property CodigoCliente : String read FCodigoCliente write SetCodigoCliente;
  end;

var
  frPresupuestosClientes: TfrPresupuestosClientes;

implementation

{$R *.DFM}

uses
  TablaPresupuestos, BaseDatos, IBCustomDataSet, PresupuestoCliente,
  InformePresupuesto, Mensajes, Sysutils, AceptarRechazarPresupuestoCliente,
  FacturaCliente, FacturasClientes, BuscarPresupuestoCliente,
  StrFunc, ListadoPresupuestosCli, Constantes, Literales, SysFunc,
  CambiarSituacionPresupuesto, Configuracion, RdxEmpresaActiva,

  Correo, TablaClientes;

{ TfrPresupuestosClientes }

procedure TfrPresupuestosClientes.BuscarPresupuesto;
begin
  with TablaPresupuestos do
  begin
    DisableControls;
    Close;
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    Prepare;
    Open;
    ActualizarBotones;
    dmTablaPresupuestos.InicializarTablaPresupuestos(@TablaPresupuestos);
    EnableControls;
    Locate('CODIGO', CodigoPresupuesto, []);
  end;
end;

constructor TfrPresupuestosClientes.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Entidad := entPresupuestoCliente;
  ConfigurarFrame(Self, Self.Entidad);

  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;
  TablaPresupuestos := TIBDataSet.Create(Self);
  dsPresupuestos.DataSet := TablaPresupuestos;

  with TablaPresupuestos do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaPresupuestos.sqlConsultarGridPresupuestos);
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    Prepare;
    Open;
    ActualizarBotones;
  end;
  dmTablaPresupuestos.InicializarTablaPresupuestos(@TablaPresupuestos);
  dmTablaPresupuestos.InicializarGridPresupuestos(gridPresupuestos);
  gridPresupuestos.GotoFirst;

  cbxAno.Items := dmTablaPresupuestos.DarListaAnos(EmpresaActiva.Codigo, True);
  cbxAno.ItemIndex := 0;
end;

destructor TfrPresupuestosClientes.Destroy;
begin
  TablaPresupuestos.Close;
  TablaPresupuestos.UnPrepare;
  TablaPresupuestos.Free;
  inherited;
end;

procedure TfrPresupuestosClientes.FreeContenido;
begin
  if (Contenido is TRdxFramePresupuestos) then
    CodigoPresupuesto := (Contenido as TRdxFramePresupuestos).CodigoPresupuesto;
  inherited FreeContenido;
  BuscarPresupuesto;
end;

procedure TfrPresupuestosClientes.VerModal;
begin
  FCodigoPresupuesto := TablaPresupuestos.FieldByName('CODIGO').AsString;
  if (ContenidoModal is TfrFacturaCliente) then
    (ContenidoModal as TfrFacturaCliente).CodigoPresupuesto := CodigoPresupuesto;


  if (ContenidoModal is TfrAceptarRechazarPresupuestoCliente) then
    (ContenidoModal as TfrAceptarRechazarPresupuestoCliente).CodigoPresupuesto := CodigoPresupuesto;

//Para activar P266, descomentar esto y comentar lo anterior
{
  if (ContenidoModal is TfrCambiarSituacionPresupuesto) then
  begin
    (ContenidoModal as TfrCambiarSituacionPresupuesto).CodigoPresupuesto := CodigoPresupuesto;
    (ContenidoModal as TfrCambiarSituacionPresupuesto).Situacion := TablaPresupuestos.FieldByName('SITUACION').AsString;
  end;
}

  inherited;
end;

procedure TfrPresupuestosClientes.bAnadirClick(Sender: TObject);
begin
  Contenido := TfrPresupuestoCliente.Create(Self);
  Contenido.Modo := Anadir;
end;

procedure TfrPresupuestosClientes.bSeleccionarClick(Sender: TObject);
begin
  CodigoPresupuesto := TablaPresupuestos.FieldByName('CODIGO').AsString;
  CloseFrame;
end;

procedure TfrPresupuestosClientes.bCancelarGuardarClick(Sender: TObject);
begin
  FCodigoPresupuesto := '';
  CloseFrame;
end;

procedure TfrPresupuestosClientes.bSalirClick(Sender: TObject);
begin
  CloseFrame;
end;

procedure TfrPresupuestosClientes.SetCodigoCliente(Value: string);
begin
  if FCodigoCliente = Value then
    exit;
  FCodigoCliente := Value;
  with TablaPresupuestos do
  begin
    DisableControls;
    Close;
    SelectSQL.Assign(dmTablaPresupuestos.sqlConsultarGridPresupuestosCli);
    ParamByName('CODIGOCLIENTE').AsString := FCodigoCliente;
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;    
    Prepare;
    Open;
    ActualizarBotones;
    dmTablaPresupuestos.InicializarTablaPresupuestos(@TablaPresupuestos);
    EnableControls;
    Locate('CODIGO', CodigoPresupuesto, []);
  end;
end;

procedure TfrPresupuestosClientes.bModificarClick(Sender: TObject);
var
  SituacionAux : String;
begin
  CodigoPresupuesto := TablaPresupuestos.FieldByName('CODIGO').AsString;
  SituacionAux := dmTablaPresupuestos.DarSituacionPresupuesto(EmpresaActiva.Codigo, CodigoPresupuesto);

  Contenido := TfrPresupuestoCliente.Create(Self);
  Contenido.Modo := Modificar;
end;

procedure TfrPresupuestosClientes.bEliminarClick(Sender: TObject);
var
  SituacionAux : String;
begin
  CodigoPresupuesto := TablaPresupuestos.FieldByName('CODIGO').AsString;
  SituacionAux := dmTablaPresupuestos.DarSituacionPresupuesto(EmpresaActiva.Codigo, CodigoPresupuesto);

  if SituacionAux <> CTE_PENDIENTE then
  begin
    VerMensajeFmt(msgPreNoEliminar, [SituacionAux]);
    Exit;
  end;

  Contenido := TfrPresupuestoCliente.Create(Self);
  Contenido.Modo := Eliminar;
end;

procedure TfrPresupuestosClientes.bConsultarClick(Sender: TObject);
begin
  CodigoPresupuesto := TablaPresupuestos.FieldByName('CODIGO').AsString;
  Contenido := TfrPresupuestoCliente.Create(Self);
  Contenido.Modo := Consultar;
end;

procedure TfrPresupuestosClientes.bExportarClick(Sender: TObject);
var
  FInformePresupuesto : TInformePresupuesto;
  Fichero : String;
begin
  if not DarFicheroExportar(Fichero) then
    Exit;
  CodigoPresupuesto := TablaPresupuestos.FieldByName('CODIGO').AsString;
  FInformePresupuesto:= TInformePresupuesto.Create(Self);
  try
    FInformePresupuesto.Exportar(FCodigoPresupuesto, Fichero);
  finally
    FInformePresupuesto.Free;
  end;
end;

procedure TfrPresupuestosClientes.bAceptarClick(Sender: TObject);
var
  SituacionAux : String;
begin
  CodigoPresupuesto := TablaPresupuestos.FieldByName('CODIGO').AsString;
  SituacionAux := UpperCase(TablaPresupuestos.FieldByName('SITUACION').AsString);

  if SituacionAux = CTE_ACEPTADO then
  begin
    VerMensajeFmt(msgPreYaAceptado, [FCodigoPresupuesto]);
    exit;
  end;

  if SituacionAux = CTE_ANULADO then
  begin
    case VerMensajePreguntaFmt(msgCambiarAAceptar, [FCodigoPresupuesto]) of
      IDNO : Exit;
    end
  end;

  CaptionModal := 'Aceptar presupuesto de cliente';
  WidthModal := 350;
  HeightModal := 180;
  ModoModal := Aceptar;
  ContenidoModal := TfrAceptarRechazarPresupuestoCliente.Create(Self);

//Para activar P266, descomentar esto y comentar lo anterior
{
  CaptionModal := 'Cambiar situacion de presupuesto de cliente';
  WidthModal := 400;
  HeightModal := 200;
  ModoModal := Aceptar;
  ContenidoModal := TfrCambiarSituacionPresupuesto.Create(Self);
}
end;

procedure TfrPresupuestosClientes.bAnularClick(Sender: TObject);
var
  SituacionAux : String;
begin
  CodigoPresupuesto := TablaPresupuestos.FieldByName('CODIGO').AsString;
  SituacionAux := UpperCase(TablaPresupuestos.FieldByName('SITUACION').AsString);

  if SituacionAux = CTE_ANULADO then
  begin
    VerMensajeFmt(msgPreYaAnulado, [FCodigoPresupuesto]);
    exit;
  end;

  if SituacionAux = CTE_ACEPTADO then
  begin
    case VerMensajePreguntaFmt(msgCambiarAAnular, [FCodigoPresupuesto]) of
      IDNO : Exit;
    end
  end;

  CaptionModal := 'Anular presupuesto de cliente';
  WidthModal := 350;
  HeightModal := 180;
  ModoModal := Anular;
  ContenidoModal := TfrAceptarRechazarPresupuestoCliente.Create(Self);
end;

procedure TfrPresupuestosClientes.CambiarModo(ModoAnterior,
  Modo: TRdxModo);
begin
  with TablaPresupuestos do
  begin
    Close;
    case Modo of
      Consultar : SelectSQL.Assign(dmTablaPresupuestos.sqlConsultarGridPresupuestosCli);
      Facturar  : SelectSQL.Assign(dmTablaPresupuestos.sqlConsultarGridPresupuestosFacturar);
    end;
  end;
  inherited;
end;

procedure TfrPresupuestosClientes.ActualizarBarras;
begin
  inherited;
  case Modo of
    Consultar : begin
                  if BarraSeleccion <> NIL then BarraSeleccion.Visible := False;
                  if BarraSalir <> NIL then BarraSalir.Visible := True;
                  if BarraOperacion <> NIL then BarraOperacion.Visible := False;
                end;
    Facturar  : begin
                  if BarraSeleccion <> NIL then BarraSeleccion.Visible := True;
                  if BarraSalir <> NIL then BarraSalir.Visible := False;
                  if BarraOperacion <> NIL then BarraOperacion.Visible := False;
                end;
  end;
end;

procedure TfrPresupuestosClientes.bFacturarClick(Sender: TObject);
var
  SituacionAux : String;
  FacturadoAux : Boolean;
begin
  CodigoPresupuesto := TablaPresupuestos.FieldByName('CODIGO').AsString;

  SituacionAux := dmTablaPresupuestos.DarSituacionPresupuesto(EmpresaActiva.Codigo, CodigoPresupuesto);
  if SituacionAux <> CTE_ACEPTADO then
  begin
    VerMensajeFmt(msgPreNoSePuedeFacturar, [FCodigoPresupuesto]);
    exit;
  end;

  FacturadoAux := dmTablaPresupuestos.PresupuestoFacturado(EmpresaActiva.Codigo, CodigoPresupuesto);
  if FacturadoAux then
  begin
    VerMensajeFmt(msgPreYaFacturado, [FCodigoPresupuesto]);
    exit;
  end;

  CaptionModal := 'Facturar presupuesto de cliente';
  WidthModal := 758;
  HeightModal := 670;
  ModoModal := Anadir;
  EntidadModal := entFacturaCliente;
  ContenidoModal := TfrFacturaCliente.Create(Self);
end;

procedure TfrPresupuestosClientes.ActualizarBotones;
begin
  if BaseDatos.IsReadOnly then
  begin
    bAnadir.Enabled := False;
    bModificar.Enabled := False;
    bEliminar.Enabled := False;
    bConsultar.Enabled := True;
    bBuscar.Enabled := True;
    bAceptar.Enabled := False;
    bAnular.Enabled := False;
    bFacturar.Enabled := False;
    bImprimir.Enabled := True;
    bExportar.Enabled := True;
    bListar.Enabled := True;
    Exit;
  end;

  if TablaPresupuestos.RecordCount = 0 then
  begin
    bAnadir.Enabled := True;
    bModificar.Enabled := False;
    bEliminar.Enabled := False;
    bConsultar.Enabled := False;
    bBuscar.Enabled := False;
    bAceptar.Enabled := False;
    bAnular.Enabled := False;
    bFacturar.Enabled := False;
    bImprimir.Enabled := False;
    bExportar.Enabled := False;
    bListar.Enabled := False;
  end
  else begin
    bAnadir.Enabled := True;
    bModificar.Enabled := True;
    bEliminar.Enabled := True;
    bConsultar.Enabled := True;
    bBuscar.Enabled := True;
    bAceptar.Enabled := True;
    bAnular.Enabled := True;
    bFacturar.Enabled := True;
    bImprimir.Enabled := True;
    bExportar.Enabled := True;
    bListar.Enabled := True;
  end;
end;

procedure TfrPresupuestosClientes.bBuscarClick(Sender: TObject);
begin
  CodigoPresupuesto := TablaPresupuestos.FieldByName('CODIGO').AsString;
  Contenido := TfrBuscarPresupuestoCliente.Create(Self);
end;

procedure TfrPresupuestosClientes.bImprimirClick(Sender: TObject);
var
  FInformePresupuesto : TInformePresupuesto;
begin
  CodigoPresupuesto := TablaPresupuestos.FieldByName('CODIGO').AsString;
  FInformePresupuesto:= TInformePresupuesto.Create(Self);
  try
    FInformePresupuesto.Imprimir(FCodigoPresupuesto);
  finally
    FInformePresupuesto.Free;
  end;
end;

procedure TfrPresupuestosClientes.gridPresupuestosRefreshButton(Sender: TObject);
begin
  BuscarPresupuesto;
end;

procedure TfrPresupuestosClientes.gridPresupuestosCustomDrawCell(
  Sender: TObject; ACanvas: TCanvas; ARect: TRect; ANode: TdxTreeListNode;
  AColumn: TdxTreeListColumn; ASelected, AFocused, ANewItemRow: Boolean;
  var AText: String; var AColor: TColor; AFont: TFont;
  var AAlignment: TAlignment; var ADone: Boolean);
var
  IndiceCol : Integer;
begin
  if not ASelected then
  begin
    IndiceCol := (Sender as TdxDBGrid).ColumnByFieldName('CODIGOFACTURA').Index;
    if not EsCadenaVacia(ANode.Strings[IndiceCol]) then
    begin
      AFont.Color := COLOR_FACTURADO;
      Exit;
    end;
    IndiceCol := (Sender as TdxDBGrid).ColumnByFieldName('SITUACION').Index;
    if ANode.Strings[IndiceCol] = CTE_ACEPTADO then
      AFont.Color := COLOR_ACEPTADO
    else if ANode.Strings[IndiceCol] = CTE_ANULADO then
      AFont.Color := COLOR_ANULADO;
  end;
end;

procedure TfrPresupuestosClientes.bCopiarClick(Sender: TObject);
begin
  Contenido := TfrPresupuestoCliente.Create(Self);
  (Contenido as TfrPresupuestoCliente).CodigoPresupuestoOrigen := TablaPresupuestos.FieldByName('CODIGO').AsString; 
  Contenido.Modo := Anadir;
end;

procedure TfrPresupuestosClientes.Listadepresupuestosdecliente1Click(
  Sender: TObject);
begin
  Contenido := TfrListadoPresupuestosCli.Create(Self);
end;

procedure TfrPresupuestosClientes.cbxAnoChange(Sender: TObject);
begin
  if cbxAno.Text = CTE_TODOS then begin
    gridPresupuestos.Filter.Remove(gridPresupuestos.FindColumnByFieldName(CTE_ANO));
    gridPresupuestos.Filter.Clear;
  end
  else begin
    gridPresupuestos.Filter.Clear;
    gridPresupuestos.Filter.Add(gridPresupuestos.FindColumnByFieldName(CTE_ANO), cbxAno.Text, cbxAno.Text);
  end;

  gridPresupuestos.SetFocus;
  gridPresupuestos.GotoFirst;
//Falta seleccionar tupla
end;

procedure TfrPresupuestosClientes.gridPresupuestosDblClick(
  Sender: TObject);
begin
  if Modo in [Seleccionar, Facturar] then
    bSeleccionar.Click
  else
    bModificar.Click;
end;

procedure TfrPresupuestosClientes.SetContenido(NuevoFrame: TRdxFrame);
begin
  inherited;
  if (Contenido is TfrListadoPresupuestosCli) then
    (Contenido as TfrListadoPresupuestosCli).CodigoCliente := TablaPresupuestos.FieldByName('CODIGOCLIENTE').AsString;
end;

procedure TfrPresupuestosClientes.bEnviarCorreoClick(Sender: TObject);
var
  FInforme : TInformePresupuesto;
  Fichero : String;
  Datos: TDatosCorreo;
  CodigoCliente: String;

begin
  CodigoPresupuesto := TablaPresupuestos.FieldByName('CODIGO').AsString;
  CodigoCliente := TablaPresupuestos.FieldByName('CODIGOCLIENTE').AsString;
  Datos:= Nil;
  Fichero := CodigoPresupuesto;
  Fichero := DarRutaTemporal + StringReplace(Fichero, CTE_SEPSERIADO, CTE_SEPSERIADO2, [rfReplaceAll, rfIgnoreCase]);
  Fichero := Fichero + CTE_DOC;

  //Generamos el fichero para luego adjuntaro al correo
  FInforme:= TInformePresupuesto.Create(Self);
  try
    FInforme.Exportar(CodigoPresupuesto, Fichero);
  finally
    FInforme.Free;
  end;

  try
  //Creamos el correo
  Datos:= TDatosCorreo.Create;
  Datos.Direcciones.add(dmTablaClientes.darCorreo(CodigoCliente));
  Datos.Adjuntos.Add(Fichero);
  enviarCorreo(Datos);
  finally
    FreeAndNil(Datos);
  end;
end;

end.
