{ =============================================================================== 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.9 Fecha versión actual: 07-01-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 Se ha cambiado la etiqueta 'Listado de facturas' por 'Listado de facturas pendientes'. 18-01-2002 Se han coloreado las filas del grid dependiendo de la situación de la factura. 07-04-2002 Se ha adaptado para la transacción única. 04-05-2002 Adaptación al grid 'TdxDBGrid'. 02-08-2002 P233. Poder cambiar la situación a muchas facturas a la vez. 08-04-2003 P263. Agrupar por años las facturas. 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. 07-01-2005 Arreglo de informes de facturas pendientes y facturas de iva que llaman al mismo frame y no cambiaba pero al cambiar entidad solo si funciona. =============================================================================== } unit FacturasClientes; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, RdxFrameFacturasCliente, Grids, DBGrids, ComCtrls, RdxBotones, ToolWin, ExtCtrls, Tipos, Menus, am2000menuitem, am2000popupmenu, am2000, RXDBCtrl, Db, RdxPaneles, RdxBarras, dxCntner, dxTL, dxDBCtrl, RdxFrame, dxDBGrid, StdCtrls, RdxComboBox, am2000utils; type TfrFacturasClientes = class(TRdxFrameFacturasCliente) dsFacturas: TDataSource; menuListar: TPopupMenu2000; MenuItem20002: TMenuItem2000; MenuItem20004: TMenuItem2000; MenuItem20005: TMenuItem2000; BarraFacturas: TRdxBarraSuperior; bAnadir: TRdxBotonMenu; bModificar: TRdxBotonSuperior; bEliminar: TRdxBotonSuperior; bConsultar: TRdxBotonSuperior; bBuscar: TRdxBotonSuperior; bListar: TRdxBotonMenu; pnlCuerpo: TRdxPanel; pnlGrid: TRdxPanel; pnlExtra: TRdxBarraSuperior; bCambiarSituacion: TRdxBoton; brSeleccion: TRdxBarraInferior; bSeleccionar: TRdxBoton; bCancelarGuardar: TRdxBoton; brSimple: TRdxBarraInferior; bSalir: TRdxBoton; bImprimir: TRdxBoton; bExportar: TRdxBoton; gridFacturas: TdxDBGrid; N1: TMenuItem2000; Listadefacturasdecliente1: TMenuItem2000; menuAnadir: TPopupMenu2000; miFacturaLibre: TMenuItem2000; miSep1: TMenuItem2000; miFacturaPre: TMenuItem2000; miSep2: TMenuItem2000; miSep3: TMenuItem2000; miAbono: TMenuItem2000; miFacturaAlbaran: TMenuItem2000; imgSombra: TImage; RdxPanel1: TRdxPanel; Label1: TLabel; cbxAno: TRdxComboBox; bEnviarCorreo: TRdxBoton; procedure bAnadirClick(Sender: TObject); procedure bModificarClick(Sender: TObject); procedure bConsultarClick(Sender: TObject); procedure bBuscarClick(Sender: TObject); procedure bEliminarClick(Sender: TObject); procedure bSeleccionarClick(Sender: TObject); procedure bCancelarGuardarClick(Sender: TObject); procedure bSalirClick(Sender: TObject); procedure MenuItem20002Click(Sender: TObject); procedure MenuItem20005Click(Sender: TObject); procedure Listadefacturasdecliente1Click(Sender: TObject); procedure bCambiarSituacionClick(Sender: TObject); procedure bImprimirClick(Sender: TObject); procedure bExportarClick(Sender: TObject); procedure gridFacturasRefreshButton(Sender: TObject); procedure gridFacturasCustomDrawCell(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 miAbonoClick(Sender: TObject); procedure miFacturaAlbaranClick(Sender: TObject); procedure miFacturaPreClick(Sender: TObject); procedure miFacturaLibreClick(Sender: TObject); procedure cbxAnoChange(Sender: TObject); procedure gridFacturasDblClick(Sender: TObject); procedure bEnviarCorreoClick(Sender: TObject); private FCodigoCliente : String; FCodigoPresupuesto : String; FCodigoAlbaran : String; procedure SetCodigoCliente (Value : String); procedure ActualizarBotones; protected procedure FreeContenido; override; procedure BuscarFactura; override; procedure VerModal; override; procedure SetContenido (NuevoFrame : TRdxFrame); override; public constructor Create (AOwner : TComponent); override; destructor Destroy; override; published property CodigoCliente : String read FCodigoCliente write SetCodigoCliente; end; var frFacturasClientes: TfrFacturasClientes; implementation {$R *.DFM} uses FacturaCliente, BuscarFacturaCliente, BaseDatos, Configuracion, SysFunc, IBCustomDataSet, Mensajes, TablaFacturasCliente, RdxEmpresaActiva, StrFunc, ListadoFacturasCliPenIVA, PagarFacturaCliente, ListadoFacturasCli, InformeFacturaCliente, RdxFramePresupuestos, PresupuestosClientes, RdxFrameAlbaranes, AlbaranesClientes, Constantes, Literales, NumFunc, Correo, TablaClientes; procedure TfrFacturasClientes.bAnadirClick(Sender: TObject); begin inherited; Contenido := TfrFacturaCliente.Create(Self); Contenido.Modo := Anadir; Contenido.Visible := True; end; procedure TfrFacturasClientes.bModificarClick(Sender: TObject); begin CodigoFactura := TablaFacturas.FieldByName('CODIGO').AsString; Contenido := TfrFacturaCliente.Create(Self); Contenido.Modo := Modificar; Contenido.Visible := True; end; procedure TfrFacturasClientes.bConsultarClick(Sender: TObject); begin CodigoFactura := TablaFacturas.FieldByName('CODIGO').AsString; Contenido := TfrFacturaCliente.Create(Self); Contenido.Modo := Consultar; Contenido.Visible := True; end; procedure TfrFacturasClientes.bBuscarClick(Sender: TObject); begin CodigoFactura := TablaFacturas.FieldByName('CODIGO').AsString; Contenido := TfrBuscarFacturaCliente.Create(Self); Contenido.Visible := True; end; procedure TfrFacturasClientes.bEliminarClick(Sender: TObject); begin CodigoFactura := TablaFacturas.FieldByName('CODIGO').AsString; Contenido := TfrFacturaCliente.Create(Self); Contenido.Modo := Eliminar; Contenido.Visible := True; end; procedure TfrFacturasClientes.BuscarFactura; begin with TablaFacturas do begin DisableControls; Close; Open; dmTablaFacturasCliente.InicializarTablaFacturas(@TablaFacturas); ActualizarBotones; EnableControls; if not Locate('CODIGO', CodigoFactura, []) then gridFacturas.GotoFirst; end; end; constructor TfrFacturasClientes.Create(AOwner: TComponent); begin inherited Create(AOwner); Entidad := entFacturaCliente; ConfigurarFrame(Self, Self.Entidad); BaseDatos := dmBaseDatos.BD; Transaccion := dmBaseDatos.Transaccion; TablaFacturas := TIBDataSet.Create(Self); dsFacturas.DataSet := TablaFacturas; with TablaFacturas do begin Database := BaseDatos; Transaction := Transaccion; SelectSQL.Assign(dmTablaFacturasCliente.sqlConsultarGridFacturas); ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo; Prepare; Open; ActualizarBotones; end; dmTablaFacturasCliente.InicializarTablaFacturas(@TablaFacturas); dmTablaFacturasCliente.InicializarGridFacturas(gridFacturas); gridFacturas.GotoFirst; cbxAno.Items := dmTablaFacturasCliente.DarListaAnos(EmpresaActiva.Codigo, True); cbxAno.ItemIndex := 0; end; destructor TfrFacturasClientes.Destroy; begin TablaFacturas.Close; TablaFacturas.UnPrepare; TablaFacturas.Free; inherited; end; procedure TfrFacturasClientes.FreeContenido; begin if (ContenidoModal is TRdxFramePresupuestos) then FCodigoPresupuesto := (ContenidoModal as TRdxFramePresupuestos).CodigoPresupuesto; if (ContenidoModal is TRdxFrameAlbaranes) then FCodigoAlbaran := (ContenidoModal as TRdxFrameAlbaranes).CodigoAlbaran; if (Contenido is TRdxFrameFacturasCliente) then CodigoFactura := (Contenido as TRdxFrameFacturasCliente).CodigoFactura; inherited FreeContenido; BuscarFactura; end; procedure TfrFacturasClientes.SetCodigoCliente(Value: String); begin if EsCadenaVacia(Value) then Exit; if FCodigoCliente = Value then exit; FCodigoCliente := Value; with TablaFacturas do begin DisableControls; Close; SelectSQL.Assign(dmTablaFacturasCliente.sqlConsultarGridFacturasCli); ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo; ParamByName('CODIGOCLIENTE').AsString := FCodigoCliente; Prepare; Open; ActualizarBotones; dmTablaFacturasCliente.InicializarTablaFacturas(@TablaFacturas); EnableControls; Locate('CODIGO', CodigoFactura, []); end; end; procedure TfrFacturasClientes.VerModal; begin if (ContenidoModal is TRdxFramePresupuestos) then (ContenidoModal as TRdxFramePresupuestos).Modo := Facturar; if (ContenidoModal is TRdxFrameAlbaranes) then (ContenidoModal as TRdxFrameAlbaranes).Modo := Facturar; if (ContenidoModal is TfrPagarFacturaCliente) then (ContenidoModal as TfrPagarFacturaCliente).ListaFacturas := ListaFacturas; inherited; end; procedure TfrFacturasClientes.bSeleccionarClick(Sender: TObject); begin CodigoFactura := TablaFacturas.FieldByName('CODIGO').AsString; CloseFrame; end; procedure TfrFacturasClientes.bCancelarGuardarClick(Sender: TObject); begin FCodigoFactura := NULL; CloseFrame; end; procedure TfrFacturasClientes.bSalirClick(Sender: TObject); begin CloseFrame; end; procedure TfrFacturasClientes.ActualizarBotones; begin if BaseDatos.IsReadOnly then begin bAnadir.Enabled := False; bModificar.Enabled := False; bEliminar.Enabled := False; bConsultar.Enabled := True; bBuscar.Enabled := True; bListar.Enabled := True; bCambiarSituacion.Enabled := False; bImprimir.Enabled := True; bExportar.Enabled := True; Exit; end; if TablaFacturas.RecordCount = 0 then begin bAnadir.Enabled := True; bModificar.Enabled := False; bEliminar.Enabled := False; bConsultar.Enabled := False; bBuscar.Enabled := False; bListar.Enabled := False; bCambiarSituacion.Enabled := False; bImprimir.Enabled := False; bExportar.Enabled := False; end else begin bAnadir.Enabled := True; bModificar.Enabled := True; bEliminar.Enabled := True; bConsultar.Enabled := True; bBuscar.Enabled := True; bListar.Enabled := True; bCambiarSituacion.Enabled := True; bImprimir.Enabled := True; bExportar.Enabled := True; end; end; procedure TfrFacturasClientes.MenuItem20002Click(Sender: TObject); begin Contenido := TfrListadoFacturasCliPenIVA.Create(Self); Contenido.Entidad := entListadoFacturasCliPendientes; end; procedure TfrFacturasClientes.MenuItem20005Click(Sender: TObject); var ContenidoAux : TfrListadoFacturasCliPenIVA; begin Contenido := TfrListadoFacturasCliPenIVA.Create(Self); Contenido.Entidad := entListadoFacturasCliIVA; end; procedure TfrFacturasClientes.bCambiarSituacionClick(Sender: TObject); var Situacion : String; iAux : Integer; begin ListaFacturas := dmTablaFacturasCliente.DarListaFacturas(gridFacturas, @TablaFacturas); if (ListaFacturas = NIL) or (ListaFacturas.Count = 0) then exit; // Comprobar que todas las facturas tienen la misma situación for iAux := 0 to ListaFacturas.Count - 1 do begin if iAux = 0 then Situacion := dmTablaFacturasCliente.DarSituacionFactura(EmpresaActiva.Codigo, ListaFacturas.Strings[iAux]) else begin if Situacion <> dmTablaFacturasCliente.DarSituacionFactura(EmpresaActiva.Codigo, ListaFacturas.Strings[iAux]) then begin VerMensaje(msgFacSitDistinta); Exit; end; end; end; CaptionModal := 'Cambiar situación de factura de cliente'; WidthModal := 460; HeightModal := 200; ModoModal := Pagar; EntidadModal := entCliente; ContenidoModal := TfrPagarFacturaCliente.Create(Self); end; procedure TfrFacturasClientes.bImprimirClick(Sender: TObject); var FInformeFactura : TInformeFacturaCliente; begin CodigoFactura := TablaFacturas.FieldByName('CODIGO').AsString; FInformeFactura := TInformeFacturaCliente.Create(Self); try FInformeFactura.Imprimir(FCodigoFactura); finally FInformeFactura.Free; end; end; procedure TfrFacturasClientes.bExportarClick(Sender: TObject); var FInformeFactura : TInformeFacturaCliente; Fichero : String; begin if not DarFicheroExportar(Fichero) then Exit; CodigoFactura := TablaFacturas.FieldByName('CODIGO').AsString; FInformeFactura := TInformeFacturaCliente.Create(Self); try FInformeFactura.Exportar(FCodigoFactura, Fichero); finally FInformeFactura.Free; end; end; procedure TfrFacturasClientes.gridFacturasRefreshButton(Sender: TObject); begin BuscarFactura; end; procedure TfrFacturasClientes.gridFacturasCustomDrawCell(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('SITUACION').Index; if UpperCase(ANode.Strings[IndiceCol]) = 'PAGADA' then AFont.Color := COLOR_PAGADO; IndiceCol := (Sender as TdxDBGrid).ColumnByFieldName('CLASEFACTURA').Index; if UpperCase(ANode.Strings[IndiceCol]) = 'A' then AFont.Color := COLOR_ABONO; end; end; procedure TfrFacturasClientes.Listadefacturasdecliente1Click( Sender: TObject); begin Contenido := TfrListadoFacturasCli.Create(Self); end; procedure TfrFacturasClientes.miAbonoClick(Sender: TObject); begin CodigoFactura := TablaFacturas.FieldByName('CODIGO').AsString; // Mirar si la factura seleccionada es un cargo if (dmTablaFacturasCliente.DarClaseFactura(EmpresaActiva.Codigo, CodigoFactura) <> 'C') then begin VerMensaje(msgFacCliClaseFacDistinta); Exit; end; // Mirar si la factura está totalmente abonada if (Redondear(abs(dmTablaFacturasCliente.DarImporteTodosAbonos(EmpresaActiva.Codigo, CodigoFactura)), 2) >= Redondear(abs(TablaFacturas.FieldByName('IMPORTETOTAL').AsFloat), 2)) then begin VerMensaje(msgFacTotalmenteAbonada); Exit; end; // Mostrar la pantalla de altas Contenido := TfrFacturaCliente.Create(Self); Contenido.Modo := Anadir; (Contenido as TfrFacturaCliente).CodigoFacturaCargo := CodigoFactura; Contenido.Visible := True; end; procedure TfrFacturasClientes.miFacturaAlbaranClick(Sender: TObject); begin // Mostrar la lista de albaranes CaptionModal := 'Elija el albarán que desea facturar'; ContenidoModal := TfrAlbaranesClientes.Create(Self); if (not EsCadenaVacia(FCodigoAlbaran)) then begin Contenido := TfrFacturaCliente.Create(Self); Contenido.Modo := Anadir; (Contenido as TfrFacturaCliente).CodigoAlbaran := FCodigoAlbaran; Contenido.Visible := True; end; end; procedure TfrFacturasClientes.miFacturaPreClick(Sender: TObject); begin // Mostrar la lista de presupuestos CaptionModal := 'Elija el presupuesto que desea facturar'; ContenidoModal := TfrPresupuestosClientes.Create(Self); if (not EsCadenaVacia(FCodigoPresupuesto)) then begin Contenido := TfrFacturaCliente.Create(Self); Contenido.Modo := Anadir; (Contenido as TfrFacturaCliente).CodigoPresupuesto := FCodigoPresupuesto; Contenido.Visible := True; end; end; procedure TfrFacturasClientes.miFacturaLibreClick(Sender: TObject); begin Contenido := TfrFacturaCliente.Create(Self); Contenido.Modo := Anadir; Contenido.Visible := True; end; procedure TfrFacturasClientes.cbxAnoChange(Sender: TObject); begin if cbxAno.Text = CTE_TODOS then begin gridFacturas.Filter.Remove(gridFacturas.FindColumnByFieldName(CTE_ANO)); gridFacturas.Filter.Clear; end else begin gridFacturas.Filter.Clear; gridFacturas.Filter.Add(gridFacturas.FindColumnByFieldName(CTE_ANO), cbxAno.Text, cbxAno.Text); //Para activar P255 // gridFacturas.Filter.Add(gridFacturas.FindColumnByFieldName('MES'), '1/2002', '1/2002'); end; gridFacturas.SetFocus; gridFacturas.GotoFirst; //Falta seleccionar tupla end; procedure TfrFacturasClientes.gridFacturasDblClick(Sender: TObject); begin if Modo = Seleccionar then bSeleccionar.Click else bModificar.Click; end; procedure TfrFacturasClientes.SetContenido(NuevoFrame: TRdxFrame); begin inherited; if (Contenido is TfrListadoFacturasCli) then (Contenido as TfrListadoFacturasCli).CodigoCliente := TablaFacturas.FieldByName('CODIGOCLIENTE').AsString; end; procedure TfrFacturasClientes.bEnviarCorreoClick(Sender: TObject); var FInforme : TInformeFacturaCliente; Fichero : String; Datos: TDatosCorreo; CodigoCliente: String; begin CodigoFactura := TablaFacturas.FieldByName('CODIGO').AsString; CodigoCliente := TablaFacturas.FieldByName('CODIGOCLIENTE').AsString; Datos:= Nil; Fichero := CodigoFactura; Fichero := DarRutaTemporal + StringReplace(Fichero, CTE_SEPSERIADO, CTE_SEPSERIADO2, [rfReplaceAll, rfIgnoreCase]); Fichero := Fichero + CTE_DOC; //Generamos el fichero para luego adjuntaro al correo FInforme:= TInformeFacturaCliente.Create(Self); try FInforme.Exportar(CodigoFactura, 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.