{ =============================================================================== 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.