This repository has been archived on 2024-11-29. You can view files and clone it, but cannot push or open issues or pull requests.
Tecsitel_FactuGES/Clientes/PresupuestosClientes.pas
2007-06-21 15:47:20 +00:00

650 lines
21 KiB
ObjectPascal

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