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/Proveedores/FacturaProveedor.pas
2007-06-21 15:47:20 +00:00

1416 lines
42 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.7
Fecha versión actual: 07-03-2004
===============================================================================
Modificaciones:
Fecha Comentarios
---------------------------------------------------------------------------
09-10-2001 Se ha reestructurado la pantalla en pestañas.
21-10-2001 Las facturas de proveedor pasan a contener pedidos en vez de
material.
21-10-2001 Se utiliza una tabla de memoria para el contenido.
23-10-2001 Hay que comprobar que todos los pedidos pertenezcan al
proveedor que figura en la factura.
23-10-2001 El campo 'domiciliación bancaria' pasa a ser NO obligatorio.
27-10-2001 Se ha arreglado un fallo que al añadir un concepto estando
en la última fila lo hacia por encima del registro, no por
debajo.
29-10-2001 Cuando se elimina un concepto con <CTRL+Supr> hay que
volver a recalcular el importe total de la factura.
29-10-2001 Se ha cambiado el literal 'Notas' por 'Concepto de factura'.
29-10-2001 El campo 'Banco' se ha cambiado a campo con lista desplegable.
En esa lista aparecerán los campos dados de alta en la aplica-
ción. Se puede dejar en blanco.
31-10-2001 Se han añadido los campos IMPORTEDESCUENTO e IMPORTEIVA.
31-10-2001 Se ha cambiado el literal 'Contenido de la factura' por
'Lista de pedidos'.
27-11-2001 Si en los detalles hay alguno que es un pedido libre
saltarse la comprobación del cód.proveedor del pedido
con el cód.proveedor de la factura.
07-02-2002 Desactivada la opción de 'CancelOnExit' del grid.
10-02-2002 Repaso de CalcularTotalFactura ya que no calculaba el importe
se ha añadido CalcularTotalFactura en AnadirDatos, ModificarDatos,
setCodigoPedido, setCodigoProveedor.
07-04-2002 Se ha adaptado para la transacción única.
09-04-2002 En las funciones 'CancelarAnadir', 'CancelarModificar',
'CancelarEliminar', 'AnadirDatos', 'ModificarDatos', y
'EliminarDatos' cerrar todas las tablas que se usen.
09-04-2002 En el evento 'bCancelarClick' llamar a la función
'TratarCambios' en vez de 'DescartarOperacion'.
05-05-2002 Adaptación al grid 'TdxDBGrid'.
21-08-2002 P237. Revisar los botones de 'Eliminar' y 'Eliminar todo'
para que al pulsar 'Esc' cancele la operación y no la
ejecute como ahora.
24-09-2002 Se producía una excepción si el cursor estaba en el código
de la factura, se pulsaba la tecla 'Esc' y se elegía 'No'.
El frame estaba oculto pero saltaba el evento OnExit del
campo de código de factura.
08-03-2003 Se han puesto componentes con calendario.
07-03-2004 p272. Adaptación a multiempresa.
===============================================================================
}
unit FacturaProveedor;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
RDXFRAMEFACTURASPROVEEDOR, ExtCtrls, StdCtrls, RdxMemo, RdxComboBox,
RdxCampos, RdxTitulos, RdxPaneles, RdxBotones, RdxBarras, Grids, DBGrids,
RXDBCtrl, Db, ComCtrls, RdxPageControl, RxMemDS, dxCntner,
dxTL, dxDBCtrl, dxDBGrid, Configuracion, dxEditor, dxExEdtr, dxEdLib,
dxDBELib, cxControls, cxContainer, cxEdit, cxTextEdit, cxMaskEdit,
cxDropDownEdit, cxCalendar, cxDBEdit, cxButtonEdit;
type
TfrFacturaProveedor = class(TRdxFrameFacturasProveedor)
pnlTitulo: TRdxPanelTituloOperacion;
pnlScroll: TRdxScrollPanel;
pnlFactura: TRdxPanel;
cDatosFactura: TRdxCabecera;
eNumFacProve: TLabel;
eCodigoFactura: TLabel;
eFecha: TLabel;
eFechaVto: TLabel;
eFormaPago: TLabel;
eTipo: TLabel;
eBanco: TLabel;
eUsuario: TLabel;
eDescripcion: TLabel;
Codigo: TRdxDBEdit;
cbxFormaPago: TRdxDBComboBox;
cbxTipo: TRdxDBComboBox;
CodigoFacturaProv: TRdxDBEdit;
Usuario: TRdxDBEdit;
Notas: TRdxDBMemo;
dsFactura: TDataSource;
dsDetallesFacturas: TDataSource;
eSituacion: TLabel;
cbxSituacion: TRdxDBComboBox;
brDoble: TRdxBarraInferior;
bGuardar: TRdxBoton;
bCancelar: TRdxBoton;
brSimple: TRdxBarraInferior;
bSalir: TRdxBoton;
pnlPaginas: TRdxPanel;
paginas: TRdxPagesControl;
pagProveedor: TTabSheet;
pagContenido: TTabSheet;
pagImporte: TTabSheet;
pnlProveedor: TRdxPanel;
eCodigo: TLabel;
eNIFCIF: TLabel;
eCodigoAsignado: TLabel;
eNombre: TLabel;
ePersonaContacto: TLabel;
eFax: TLabel;
NIFCIF: TRdxDBEdit;
CodigoCliente: TRdxDBEdit;
Nombre: TRdxDBEdit;
PersonaContacto: TRdxDBEdit;
Fax: TRdxDBEdit;
pnlGridArticulos: TPanel;
pnlBarraGrid: TRdxPanel;
bAnadir: TRdxBoton;
bEliminar: TRdxBoton;
bEliminarTodo: TRdxBoton;
cbxBanco: TRdxDBComboBox;
pnlImporteAlbaran: TRdxPanel;
Label4: TLabel;
eDto: TLabel;
eIVA: TLabel;
Label6: TLabel;
Shape1: TShape;
BaseImponible: TRdxDBEdit;
Descuento: TRdxDBEdit;
IVA: TRdxDBEdit;
ImporteTotal: TRdxDBEdit;
ImporteDescuento: TRdxDBEdit;
ImporteIVA: TRdxDBEdit;
gridDetalles: TdxDBGrid;
Fecha: TcxDBDateEdit;
FechaVencimiento: TcxDBDateEdit;
CodProveedor: TcxDBButtonEdit;
procedure bSalirClick(Sender: TObject);
procedure bGuardarClick(Sender: TObject);
procedure bCancelarGuardarClick(Sender: TObject);
procedure CodigoButtonClick(Sender: TObject);
procedure bAnadirClick(Sender: TObject);
procedure bEliminarClick(Sender: TObject);
procedure bEliminarTodoClick(Sender: TObject);
procedure CodigoExit(Sender: TObject);
procedure FechaExit(Sender: TObject);
procedure FechaVencimientoExit(Sender: TObject);
procedure CodProveedorPropertiesButtonClick(Sender: TObject;
AButtonIndex: Integer);
procedure CodProveedorPropertiesValidate(Sender: TObject;
var DisplayValue: Variant; var ErrorText: TCaption;
var Error: Boolean);
private
FCodigoProveedor : Variant;
FCodigoPedido : Variant;
FTablaDetallesMem : TRxMemoryData;
procedure CalcularTotalFactura;
procedure BorrarDetalles;
procedure SalvarDetalles;
procedure CargarDetalles;
procedure BorrarDetallesIB;
function NoFacturarPedidos : boolean;
function FacturarPedidos : boolean;
procedure ActivarEventosCampos;
procedure DetalleAfterDelete (DataSet: TDataSet);
procedure IVASetText(Sender: TField; const Text: String);
procedure DtoSetText(Sender: TField; const Text: String);
protected
procedure ActivarModoAnadir; override;
procedure ActivarModoModificar; override;
procedure ActivarModoConsultar; override;
procedure ActivarModoEliminar; override;
function AnadirDatos : Boolean; override;
function ModificarDatos : Boolean; override;
function EliminarDatos : Boolean; override;
function CancelarAnadir : Boolean; override;
function CancelarModificar : Boolean; override;
function CancelarEliminar : Boolean; override;
function ComprobarDatos : Boolean; override;
procedure SetCodigoProveedor (Value : Variant);
procedure SetCodigoPedido (Value : Variant);
procedure FreeContenido; override;
procedure BuscarFactura; override;
procedure VerModal; override;
public
property CodigoProveedor : Variant read FCodigoProveedor write SetCodigoProveedor;
property CodigoPedido : Variant read FCodigoPedido write SetCodigoPedido;
constructor Create (AOwner : TComponent); override;
destructor Destroy; override;
published
property TablaFacturasProveedor;
property TablaDetallesFacturas;
property TablaDetallesMem : TRxMemoryData read FTablaDetallesMem write FTablaDetallesMem;
property CodigoFactura;
procedure GridBotonCodigoPedidoClick(Sender: TObject);
procedure PrecioDetalleSetText(Sender: TField; const Text: String);
procedure CodigoPedidoDetalleSetText(Sender: TField; const Text: String);
end;
var
frFacturaProveedor: TfrFacturaProveedor;
implementation
uses
BaseDatos, TablaFacturasProveedor, IB, Mensajes, TablaArticulos,
Tipos, IBCustomDataSet, TablaFormasPago, RdxFrameArticulos,
FacturasProveedores, PedidosProveedores, Proveedores, TablaProveedores,
Articulos, RdxFrameProveedores, TablaPedidosProveedor, NumFunc,
RdxFramePedidosProveedor, StrFunc, IBErrorCodes, Excepciones,
TablaBancos, dxDBTLCL, RdxEmpresaActiva, Literales;
{$R *.DFM}
{ TfrFacturaProveedor }
procedure TfrFacturaProveedor.ActivarModoAnadir;
var
CodNuevo : Variant;
begin
dsFactura.AutoEdit := True;
dsDetallesFacturas.AutoEdit := True;
Codigo.VerBoton := False;
Codigo.ReadOnly := False;
cbxTipo.ReadOnly := False;
CodProveedor.Properties.Buttons[0].Visible := True;
CodProveedor.Properties.OnValidate := CodProveedorPropertiesValidate;
ActivarEdicionGridDetalles(gridDetalles);
(gridDetalles.ColumnByFieldName('CODIGOPEDIDO')
as TdxDBTreeListButtonColumn).OnEditButtonClick := GridBotonCodigoPedidoClick;
pnlBarraGrid.Visible := True;
try
{ Antes de aplicar la caché hay que asegurarse de que la
tabla está cerrada. }
TablaFacturasProveedor.DisableControls;
TablaDetallesFacturas.DisableControls;
{ Inicializar la tabla de Facturas }
TablaFacturasProveedor.Close;
CodNuevo := dmTablaFacturasProveedor.darNuevoCodigo;
with TablaFacturasProveedor do
begin
CachedUpdates := True;
Prepare;
Open;
EnableControls;
Insert;
FieldByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
end;
Codigo.Field.asString := CodNuevo;
Fecha.DataBinding.Field.AsString := DateToStr(Date);
Usuario.Field.AsString := dmBaseDatos.Usuario;
cbxSituacion.Field.AsString := cbxSituacion.Items[0];
cbxTipo.Field.AsString := cbxTipo.Items[0];
{ Inicializar la tabla de detalles }
with TablaDetallesFacturas do
begin
Close;
ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
ParamByName('CODIGOFACTURA').AsString := CodNuevo;
Prepare;
Open;
EnableControls;
end;
TablaDetallesMem.Close;
TablaDetallesMem.Open;
ActivarEventosCampos;
dmTablaFacturasProveedor.InicializarTablaFacturas(@TablaFacturasProveedor);
dmTablaFacturasProveedor.InicializarTablaDetalles(@TablaDetallesMem);
FacturarPedidos;
Visible := True;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrFacturaProveedor.ActivarModoConsultar;
begin
dsFactura.AutoEdit := False;
dsDetallesFacturas.AutoEdit := False;
Codigo.VerBoton := True;
CodProveedor.Properties.Buttons[0].Visible := False;
CodProveedor.Properties.OnValidate := nil;
DesactivarEdicionGridDetalles(gridDetalles);
(gridDetalles.ColumnByFieldName('CODIGOPEDIDO')
as TdxDBTreeListButtonColumn).OnEditButtonClick := NIL;
pnlBarraGrid.Visible := False;
try
TablaFacturasProveedor.Prepare;
TablaFacturasProveedor.Open;
if TablaFacturasProveedor.RecordCount = 0 then
begin
VerMensajeFmt(msgFacProNoExiste, [CodigoFactura]);
CloseFrame;
Exit;
end;
TablaFacturasProveedor.Cancel;
with TablaDetallesFacturas do
begin
Close;
ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
ParamByName('CODIGOFACTURA').AsString := CodigoFactura;
Prepare;
Open;
Cancel;
end;
TablaDetallesMem.Close;
TablaDetallesMem.Open;
CargarDetalles;
dmTablaFacturasProveedor.InicializarTablaFacturas(@TablaFacturasProveedor);
dmTablaFacturasProveedor.InicializarTablaDetalles(@TablaDetallesMem);
Visible := True;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrFacturaProveedor.ActivarModoEliminar;
begin
dsFactura.AutoEdit := False;
dsDetallesFacturas.AutoEdit := False;
Codigo.VerBoton := True;
CodProveedor.Properties.Buttons[0].Visible := False;
CodProveedor.Properties.OnValidate := nil;
DesactivarEdicionGridDetalles(gridDetalles);
(gridDetalles.ColumnByFieldName('CODIGOPEDIDO')
as TdxDBTreeListButtonColumn).OnEditButtonClick := NIL;
pnlBarraGrid.Visible := False;
try
TablaFacturasProveedor.Prepare;
TablaFacturasProveedor.Open;
if TablaFacturasProveedor.RecordCount = 0 then
begin
VerMensajeFmt(msgFacProNoExiste, [CodigoFactura]);
CancelarEliminar;
CloseFrame;
Exit;
end;
TablaFacturasProveedor.Cancel;
with TablaDetallesFacturas do
begin
Close;
ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
ParamByName('CODIGOFACTURA').AsString := CodigoFactura;
Prepare;
Open;
Cancel;
end;
TablaDetallesMem.Close;
TablaDetallesMem.Open;
CargarDetalles;
dmTablaFacturasProveedor.InicializarTablaFacturas(@TablaFacturasProveedor);
dmTablaFacturasProveedor.InicializarTablaDetalles(@TablaDetallesMem);
Visible := True;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrFacturaProveedor.ActivarModoModificar;
begin
dsFactura.AutoEdit := True;
dsDetallesFacturas.AutoEdit := True;
Codigo.VerBoton := True;
Codigo.ReadOnly := True;
cbxTipo.ReadOnly := True;
CodProveedor.Properties.Buttons[0].Visible := True;
CodProveedor.Properties.OnValidate := CodProveedorPropertiesValidate;
ActivarEdicionGridDetalles(gridDetalles);
(gridDetalles.ColumnByFieldName('CODIGOPEDIDO')
as TdxDBTreeListButtonColumn).OnEditButtonClick := GridBotonCodigoPedidoClick;
pnlBarraGrid.Visible := True;
try
{ Antes de aplicar la caché hay que asegurarse de que la
tabla está cerrada. }
TablaFacturasProveedor.Prepare;
TablaFacturasProveedor.Open;
if TablaFacturasProveedor.RecordCount = 0 then
begin
VerMensajeFmt(msgFacProNoExiste, [CodigoFactura]);
CancelarModificar;
CloseFrame;
Exit;
end;
TablaFacturasProveedor.Edit;
with TablaDetallesFacturas do
begin
Close;
ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
Params.ByName('CODIGOFACTURA').AsString := CodigoFactura;
Prepare;
Open;
end;
TablaDetallesMem.Close;
TablaDetallesMem.Open;
CargarDetalles;
ActivarEventosCampos;
TablaDetallesMem.FieldByName('PRECIO').OnSetText := PrecioDetalleSetText;
TablaDetallesMem.FieldByName('CODIGOPEDIDO').OnSetText := CodigoPedidoDetalleSetText;
dmTablaFacturasProveedor.InicializarTablaFacturas(@TablaFacturasProveedor);
dmTablaFacturasProveedor.InicializarTablaDetalles(@TablaDetallesMem);
CalcularTotalFactura;
Visible := True;
except
on E : EIBError do
begin
case E.IBErrorCode of
isc_lock_conflict : begin
VerMensajeFmt(msgFacProBloqueada, [CodigoFactura]);
CancelarModificar;
CloseFrame;
Exit;
end
else
TratarExcepcion(E);
end;
end;
on E : Exception do
TratarExcepcion(E);
end;
end;
function TfrFacturaProveedor.AnadirDatos: Boolean;
begin
Result := False;
try
CalcularTotalFactura;
TablaFacturasProveedor.Post;
TablaFacturasProveedor.ApplyUpdates;
BorrarDetallesIB;
SalvarDetalles;
FCodigoFactura := TablaFacturasProveedor.FieldByName('CODIGO').AsString;
NoFacturarPedidos;
FacturarPedidos;
dmTablaFacturasProveedor.IncrementarCodigo;
Commit;
TablaFacturasProveedor.CachedUpdates := False;
TablaFacturasProveedor.Close;
TablaDetallesFacturas.Close;
TablaDetallesMem.Close;
Result := True;
except
on E : EIBError do begin
if E.IBErrorCode = isc_unique_key_violation then
begin
VerMensajeFmt(msgFacProCodFacRepetido, [Codigo.Field.AsString]);
TablaFacturasProveedor.Edit;
end
else
TratarExcepcion(E);
TablaFacturasProveedor.Edit;
end;
on E : Exception do begin
TratarExcepcion(E);
TablaFacturasProveedor.Edit;
end;
end;
end;
procedure TfrFacturaProveedor.BuscarFactura;
begin
if Transaccion = NIL then
exit;
try
TablaFacturasProveedor.DisableControls;
TablaDetallesFacturas.DisableControls;
TablaDetallesMem.DisableControls;
TablaFacturasProveedor.Close;
TablaDetallesFacturas.Close;
// Buscar la fila a tratar si es necesario
if not EsCadenaVacia(FCodigoFactura) then
begin
TablaFacturasProveedor.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
TablaFacturasProveedor.ParamByName('CODIGO').AsString := FCodigoFactura;
TablaDetallesFacturas.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
TablaDetallesFacturas.ParamByName('CODIGOFACTURA').AsString := FCodigoFactura;
end;
TablaFacturasProveedor.Prepare;
TablaFacturasProveedor.Open;
TablaDetallesFacturas.Prepare;
TablaDetallesFacturas.Open;
TablaDetallesMem.Close;
TablaDetallesMem.Open;
BorrarDetalles;
CargarDetalles;
dmTablaFacturasProveedor.InicializarTablaFacturas(@TablaFacturasProveedor);
dmTablaFacturasProveedor.InicializarTablaDetalles(@TablaDetallesMem);
TablaFacturasProveedor.EnableControls;
TablaDetallesFacturas.EnableControls;
TablaDetallesMem.EnableControls;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrFacturaProveedor.CalcularTotalFactura;
var
ImporteBaseImponible,
ImporteDto,
ImporteIVA,
ImporteTotal : Double;
CurBookmark: string;
begin
ImporteBaseImponible := 0;
with TablaDetallesMem do
begin
DisableControls;
CurBookmark := Bookmark;
try
First;
while not EOF do begin
ImporteBaseImponible := ImporteBaseImponible + FieldByName('PRECIO').AsFloat;
Next;
end;
ImporteDto := (ImporteBaseImponible * TablaFacturasProveedor.FieldByName('DESCUENTO').AsFloat) / 100;
ImporteTotal := ImporteBaseImponible - ImporteDto;
ImporteIVA := (ImporteTotal * TablaFacturasProveedor.FieldByName('IVA').AsFloat) / 100;
ImporteTotal := ImporteTotal + ImporteIVA;
TablaFacturasProveedor.Edit;
TablaFacturasProveedor.FieldByName('BASEIMPONIBLE').AsFloat := ImporteBaseImponible;
TablaFacturasProveedor.FieldByName('IMPORTEDESCUENTO').AsFloat := ImporteDto;
TablaFacturasProveedor.FieldByName('IMPORTEIVA').AsFloat := ImporteIVA;
TablaFacturasProveedor.FieldByName('IMPORTETOTAL').AsFloat := ImporteTotal;
finally
Bookmark := CurBookmark;
EnableControls;
end;
end;
end;
function TfrFacturaProveedor.CancelarAnadir: Boolean;
begin
Result := False;
try
TablaDetallesMem.Close;
TablaFacturasProveedor.CancelUpdates;
RollBack;
TablaFacturasProveedor.CachedUpdates := False;
TablaFacturasProveedor.Close;
TablaDetallesFacturas.Close;
Result := True;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
function TfrFacturaProveedor.CancelarEliminar: Boolean;
begin
Result := False;
try
TablaDetallesMem.Close;
RollBack;
TablaFacturasProveedor.Close;
TablaDetallesFacturas.Close;
Result := True;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
function TfrFacturaProveedor.CancelarModificar: Boolean;
begin
Result := False;
try
TablaDetallesMem.Close;
RollBack;
TablaFacturasProveedor.Close;
TablaDetallesFacturas.Close;
Result := True;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
function TfrFacturaProveedor.ComprobarDatos: Boolean;
var
Situacion : string;
CodPedAux : string;
CodProvPed : string;
begin
Result := False;
if not (Modo in [Anadir, Modificar]) then
begin
Result := True;
exit;
end;
if EsCadenaVacia(Fecha.DataBinding.Field.AsString) then
begin
VerMensaje(msgFacProFaltaFecha);
Fecha.SetFocus;
Exit;
end;
if EsCadenaVacia(FechaVencimiento.DataBinding.Field.AsString) then
begin
VerMensaje(msgFacProFaltaFechaVto);
FechaVencimiento.SetFocus;
Exit;
end
else
if (FechaVencimiento.DataBinding.Field.AsDateTime < Fecha.DataBinding.Field.AsDateTime) then
begin
VerMensaje(msgFacProFechaVtoAnterior);
FechaVencimiento.SetFocus;
Exit;
end;
if EsCadenaVacia(Nombre.Field.AsString) then
begin
VerMensaje(msgFacProFaltaNombreProv);
Paginas.ActivePage := pagProveedor;
Nombre.SetFocus;
Exit;
end;
if EsCadenaVacia(cbxFormaPago.Field.AsString) then
begin
VerMensaje(msgFaltaFormaPago);
cbxFormaPago.SetFocus;
Exit;
end;
if TablaDetallesMem.IsEmpty then
begin
VerMensaje(msgFacProFaltanDetalles);
Paginas.ActivePage := pagContenido;
gridDetalles.SetFocus;
Exit;
end;
with TablaDetallesMem do
begin
DisableControls;
First;
while not EOF do
begin
CodPedAux := FieldByName('CODIGOPEDIDO').AsString;
// Comprobar la situación del pedido.
Situacion := UpperCase(dmTablaPedidosProveedor.DarSituacion(EmpresaActiva.Codigo, CodPedAux));
if not EsCadenaVacia(Situacion) then
begin
if (cbxTipo.Field.AsString = 'NORMAL') and (Situacion <> 'TOTALMENTE RECIBIDO') then
begin
VerMensajeFmt(msgFacProSitPedInc, [CodPedAux, Situacion, cbxTipo.Field.AsString]);
EnableControls;
Exit;
end;
if (cbxTipo.Field.AsString = 'ABONO') and (Situacion <> 'DEVUELTO') then
begin
VerMensajeFmt(msgFacProSitPedInc, [CodPedAux, Situacion, cbxTipo.Field.AsString]);
EnableControls;
Exit;
end;
end;
// Comprobar si el proveedor de la factura es el mismo que el proveedor
// del pedido.
CodProvPed := FieldByName('CODIGOPROVEEDOR').AsString;
if (not EsCadenaVacia(CodProvPed)) and (CodProvPed <> CodProveedor.DataBinding.Field.AsString) then
begin
VerMensajeFmt(msgFacProPedNoPro, [CodPedAux]);
EnableControls;
Exit;
end;
Next;
end;
EnableControls;
end;
Result := True;
end;
constructor TfrFacturaProveedor.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FCodigoProveedor := NULL;
FCodigoPedido := NULL;
Entidad := entFacturaProveedor;
ConfigurarFrame(Self, Self.Entidad);
BaseDatos := dmBaseDatos.BD;
Transaccion := dmBaseDatos.Transaccion;
TablaFacturasProveedor := TIBDataSet.Create(Self);
TablaDetallesFacturas := TIBDataSet.Create(Self);
TablaDetallesMem := TRxMemoryData.Create(Self);
dsFactura.DataSet := TablaFacturasProveedor;
dsDetallesFacturas.DataSet := TablaDetallesMem;
with TablaFacturasProveedor do
begin
Database := BaseDatos;
Transaction := Transaccion;
SelectSQL.Assign(dmTablaFacturasProveedor.sqlConsultarFactura);
InsertSQL.Assign(dmTablaFacturasProveedor.sqlInsertarFactura);
ModifySQL.Assign(dmTablaFacturasProveedor.sqlModificarFactura);
DeleteSQL.Assign(dmTablaFacturasProveedor.sqlEliminarFactura);
end;
with TablaDetallesFacturas do
begin
Database := BaseDatos;
Transaction := Transaccion;
SelectSQL.Assign(dmTablaFacturasProveedor.sqlConsultarGridDetalles);
InsertSQL.Assign(dmTablaFacturasProveedor.sqlInsertarDetalles);
ModifySQL.Assign(dmTablaFacturasProveedor.sqlModificarDetalles);
DeleteSQL.Assign(dmTablaFacturasProveedor.sqlEliminarDetalles);
end;
TablaDetallesMem.CopyStructure(TablaDetallesFacturas);
TablaDetallesMem.FieldByName('CODIGOEMPRESA').Required := False;
TablaDetallesMem.FieldByName('CODIGOFACTURA').Required := False;
TablaDetallesMem.FieldByName('NUMCONCEPTO').Required := False;
dmTablaFacturasProveedor.InicializarGridDetalles(gridDetalles);
cbxFormaPago.Items := dmTablaFormasPago.DarFormasPago;
cbxSituacion.Items := dmTablaFacturasProveedor.DarSituaciones;
cbxBanco.Items := dmTablaBancos.DarBancos;
Paginas.ActivePage := pagProveedor;
end;
destructor TfrFacturaProveedor.Destroy;
begin
gridDetalles.DataSource := NIL;
TablaDetallesMem.Close;
TablaDetallesMem.Free;
TablaFacturasProveedor.Close;
TablaFacturasProveedor.UnPrepare;
TablaFacturasProveedor.Free;
TablaDetallesFacturas.Close;
TablaDetallesFacturas.Unprepare;
TablaDetallesFacturas.Free;
inherited;
end;
function TfrFacturaProveedor.EliminarDatos: Boolean;
begin
Result := False;
if (VerMensajePregunta(msgFacProBorrarFacPed) <> mrYes) then
Exit;
try
NoFacturarPedidos;
TablaFacturasProveedor.Delete;
Commit;
BorrarDetalles;
TablaFacturasProveedor.Close;
TablaDetallesFacturas.Close;
TablaDetallesMem.Close;
Result := True;
except
on E : EIBError do
begin
case E.IBErrorCode of
isc_lock_conflict : VerMensajeFmt(msgFacProBloqueada, [Codigo.Field.AsString]);
else
TratarExcepcion(E);
end;
end;
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrFacturaProveedor.FreeContenido;
begin
if (ContenidoModal is TRdxFrameFacturasProveedor) then begin
CodigoFactura := (ContenidoModal as TRdxFrameFacturasProveedor).CodigoFactura;
ActivarModo;
end;
if (ContenidoModal is TRdxFramePedidosProveedor) then
CodigoPedido := (ContenidoModal as TRdxFramePedidosProveedor).CodigoPedido;
if (ContenidoModal is TRdxFrameProveedores) then
CodigoProveedor := (ContenidoModal as TRdxFrameProveedores).CodigoProveedor;
inherited FreeContenido;
end;
procedure TfrFacturaProveedor.GridBotonCodigoPedidoClick(Sender: TObject);
begin
if EsCadenaVacia(CodProveedor.DataBinding.Field.AsString) then
begin
VerMensaje(msgFacProFaltaNombreProv);
paginas.ActivePage := pagProveedor;
CodProveedor.SetFocus;
Exit;
end;
TablaDetallesMem.Edit;
ModoModal := Facturar;
ContenidoModal := TfrPedidosProveedores.Create(Self);
end;
function TfrFacturaProveedor.ModificarDatos: Boolean;
begin
Result := False;
try
CalcularTotalFactura;
TablaFacturasProveedor.Post;
BorrarDetallesIB;
SalvarDetalles;
Commit;
TablaFacturasProveedor.Close;
TablaDetallesFacturas.Close;
TablaDetallesMem.Close;
Result := True;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrFacturaProveedor.PrecioDetalleSetText(Sender: TField;
const Text: String);
begin
try
if Length(Text) = 0 then
Sender.AsString := '0'
else
Sender.AsString := Text;
CalcularTotalFactura;
except
on E : EConvertError do
VerMensaje(msgPrecioNoValido);
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrFacturaProveedor.SetCodigoProveedor(Value: Variant);
var
DatosProveedor : TDatosProveedor;
begin
if VarIsNull(Value) then
exit;
FCodigoProveedor := Value;
DatosProveedor := TDatosProveedor.Create;
try
DatosProveedor.Codigo := FCodigoProveedor;
dmTablaProveedores.darDatosProveedor(DatosProveedor);
CodProveedor.DataBinding.Field.AsString := DatosProveedor.Codigo;
NIFCIF.Field.AsString := DatosProveedor.Nifcif;
CodigoCliente.Field.AsString := dmTablaProveedores.darCodigoClienteProveedor(DatosProveedor.Codigo);
Nombre.Field.AsString := DatosProveedor.Nombre;
PersonaContacto.Field.AsString := DatosProveedor.PersonaContacto;
Fax.Field.AsString := DatosProveedor.Fax;
CalcularTotalFactura;
finally
DatosProveedor.Free;
end;
end;
procedure TfrFacturaProveedor.bSalirClick(Sender: TObject);
begin
try
Rollback;
CloseFrame;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrFacturaProveedor.bGuardarClick(Sender: TObject);
begin
if (RealizarOperacion) then
CloseFrame;
end;
procedure TfrFacturaProveedor.bCancelarGuardarClick(Sender: TObject);
begin
if (TratarCambios = IDOK) then
CloseFrame;
end;
procedure TfrFacturaProveedor.CodigoButtonClick(Sender: TObject);
begin
inherited;
if (TratarCambios = IDCANCEL) then
exit;
{ Esto es porque en modo 'Modificar' hacemos un cambio y pulsamos
este botón se cierra la tabla y si en el frame hijo (el del grid) damos
a cancelar, FCodigoFactura es NULL y da error al activar modo porque
no se inicializa los parámetros de la sql. Lo hace BuscarFactura. }
if not TablaFacturasProveedor.Active then
BuscarFactura;
ContenidoModal := TfrFacturasProveedores.Create(Self);
end;
procedure TfrFacturaProveedor.SetCodigoPedido(Value: Variant);
var
SituacionAux : String;
FacturadoAux : String;
DatosPedido : TDatosPedidoProveedor;
begin
if EsCadenaVacia(CodProveedor.DataBinding.Field.AsString) then
raise Exception.Create(msgFacProFaltaNombreProv);
if EsCadenaVacia(Value) then
Exit;
FCodigoPedido := Trim(Value);
if not dmTablaPedidosProveedor.ValidarCodigo(FCodigoPedido) then
raise Exception.CreateFmt(msgPedCodPedIncorrecto, [FCodigoPedido]);
FCodigoPedido := dmTablaPedidosProveedor.FormatearCodigo(FCodigoPedido);
DatosPedido := TDatosPedidoProveedor.Create;
DatosPedido.Codigo := FCodigoPedido;
DatosPedido.CodigoEmpresa := EmpresaActiva.Codigo;
try
if not dmTablaPedidosProveedor.DarDatosPedido(DatosPedido) then
raise Exception.CreateFmt(msgPedPedProvNoExiste, [FCodigoPedido]);
if (CodProveedor.DataBinding.Field.AsString <> DatosPedido.CodigoProveedor) then
raise Exception.CreateFmt(msgFacProPedNoPro, [DatosPedido.Codigo]);
SituacionAux := UpperCase(DatosPedido.Situacion);
FacturadoAux := UpperCase(DatosPedido.CodigoFactura);
if (SituacionAux <> 'TOTALMENTE RECIBIDO') and
(SituacionAux <> 'DEVUELTO') then
raise Exception.CreateFmt(msgPedidoNoFacturar, [LowerCase(SituacionAux)]);
if not EsCadenaVacia(FacturadoAux) then
raise Exception.CreateFmt(msgPedYaFacturado, [FCodigoPedido]);
if not EsCadenaVacia(FCodigoFactura) then
begin
if not dmTablaPedidosProveedor.FacturarPedido(EmpresaActiva.Codigo, FCodigoPedido, FCodigoFactura) then
raise Exception.CreateFmt(msgFacProErrorFacPed, [FCodigoPedido]);
end;
with TablaDetallesMem do
begin
Edit;
FieldByName('CODIGOPEDIDO').AsString := DatosPedido.Codigo;
FieldByName('SITUACION').AsString := DatosPedido.Situacion;
FieldByName('PRECIO').AsString := DatosPedido.ImporteTotal;
FieldByName('DESCRIPCION').AsString := Format('Pedido a proveedor %s con fecha %s', [DatosPedido.Codigo, DatosPedido.FechaAlta]);
FieldByName('CODIGOPROVEEDOR').AsString := DatosPedido.CodigoProveedor;
end;
CalcularTotalFactura;
finally
DatosPedido.Free;
end;
end;
procedure TfrFacturaProveedor.bAnadirClick(Sender: TObject);
begin
try
with TablaDetallesMem do
begin
DisableControls;
Next;
if EOF then
Append
else
Insert;
EnableControls;
end;
Paginas.ActivePage := pagContenido;
gridDetalles.SetFocus;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrFacturaProveedor.bEliminarClick(Sender: TObject);
var
CodPedAux : string;
begin
if (VerMensajePregunta(msgDeseaBorrar) <> IDYES) then
Exit;
if TablaDetallesMem.RecordCount = 0 then begin
{ Hacemos un cancel de la tabla por si el registro actual estuviera
recien creado }
TablaDetallesMem.Cancel;
Exit
end;
try
CodPedAux := TablaDetallesMem.FieldByName('CODIGOPEDIDO').AsString;
if not EsCadenaVacia(CodPedAux) then
dmTablaPedidosProveedor.NoFacturarPedido(EmpresaActiva.Codigo, CodPedAux);
TablaDetallesMem.Delete;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
CalcularTotalFactura;
end;
procedure TfrFacturaProveedor.BorrarDetalles;
begin
with TablaDetallesMem do
begin
DisableControls;
EmptyTable;
EnableControls;
end;
end;
procedure TfrFacturaProveedor.CodigoExit(Sender: TObject);
begin
inherited;
if (Modo <> Anadir) or (Visible = false) then
exit;
if (Length(Codigo.Text) = 0) then
Codigo.Field.AsString := dmTablaFacturasProveedor.DarNuevoCodigo;
if (dmTablaFacturasProveedor.ValidarCodigo(Codigo.Text)) then
begin
Codigo.Field.asString := dmTablaFacturasProveedor.FormatearCodigo(Codigo.Text);
if (dmTablaFacturasProveedor.ExisteCodigo(Codigo.Text)) then begin
VerMensajeFmt(msgFacProCodFacRepetido, [Codigo.Text]);
Codigo.SetFocus;
end;
end
else begin
VerMensajeFmt(msgFacProCodFacIncorrecto, [Codigo.Text]);
Codigo.SetFocus;
end;
end;
procedure TfrFacturaProveedor.FechaExit(Sender: TObject);
begin
if not (Modo in [Anadir, Modificar]) then
exit;
if EsCadenaVacia(Fecha.Text) then
begin
VerMensaje(msgFacProFaltaFecha);
Fecha.DataBinding.Field.AsString := DateToStr(Date);
Fecha.SetFocus;
end;
end;
procedure TfrFacturaProveedor.FechaVencimientoExit(Sender: TObject);
begin
if not (Modo in [Anadir, Modificar]) then
exit;
if EsCadenaVacia(FechaVencimiento.Text) then
begin
VerMensaje(msgFacProFaltaFechaVto);
FechaVencimiento.SetFocus;
end;
end;
procedure TfrFacturaProveedor.bEliminarTodoClick(Sender: TObject);
begin
if (VerMensajePregunta(msgDeseaBorrarTodo) = IDYES) then
Exit;
NoFacturarPedidos;
BorrarDetalles;
BorrarDetallesIB;
CalcularTotalFactura;
end;
procedure TfrFacturaProveedor.BorrarDetallesIB;
var
CodPedAux : string;
begin
with TablaDetallesFacturas do
begin
if IsEmpty then
Exit;
DisableControls;
Last;
while not BOF do
begin
Delete;
Prior;
end;
if not IsEmpty then
Delete;
EnableControls;
end;
end;
procedure TfrFacturaProveedor.CargarDetalles;
var
NumeroCampo : Integer;
begin
with TablaDetallesMem do
begin
if TablaDetallesFacturas.IsEmpty then
Exit;
DisableControls;
TablaDetallesFacturas.First;
while not TablaDetallesFacturas.EOF do
begin
Append;
for NumeroCampo := 0 to TablaDetallesFacturas.FieldCount-1 do
Fields[NumeroCampo].AsString := TablaDetallesFacturas.Fields[NumeroCampo].AsString;
Post;
TablaDetallesFacturas.Next;
end;
EnableControls;
end;
end;
procedure TfrFacturaProveedor.SalvarDetalles;
var
NumeroCampo : Integer;
NumConcepto : Integer;
begin
try
with TablaDetallesMem do
begin
if IsEmpty then
Exit;
NumConcepto := 0;
DisableControls;
First;
while not EOF do
begin
TablaDetallesFacturas.Append;
for NumeroCampo := 0 to FieldCount-1 do
begin
if Fields[NumeroCampo].FieldName = 'CODIGOEMPRESA' then
TablaDetallesFacturas.Fields[NumeroCampo].AsInteger := EmpresaActiva.Codigo
else begin
if Fields[NumeroCampo].FieldName = 'CODIGOFACTURA' then
TablaDetallesFacturas.Fields[NumeroCampo].AsString := Codigo.Field.AsString
else
if Fields[NumeroCampo].FieldName = 'NUMCONCEPTO' then
TablaDetallesFacturas.Fields[NumeroCampo].AsInteger := NumConcepto
else
TablaDetallesFacturas.Fields[NumeroCampo].AsString := Fields[NumeroCampo].AsString;
end;
end;
TablaDetallesFacturas.Post;
Next;
NumConcepto := NumConcepto + 1;
end;
EnableControls;
end;
except
on E : EIBError do begin
if E.IBErrorCode = isc_unique_key_violation then
begin
TablaDetallesFacturas.Delete;
TablaDetallesMem.EnableControls;
end;
raise Exception.CreateFmt(msgFacProCodPedRepetido, [TablaDetallesMem.FieldByName('CODIGOPEDIDO').AsString]);
end;
end;
end;
function TfrFacturaProveedor.NoFacturarPedidos: boolean;
begin
Result := True;
with TablaDetallesMem do
begin
DisableControls;
First;
while not EOF do
begin
if (not EsCadenaVacia(FieldByName('CODIGOPEDIDO').AsString)) and
(not dmTablaPedidosProveedor.NoFacturarPedido(EmpresaActiva.Codigo, FieldByName('CODIGOPEDIDO').AsString))
then begin
Result := False;
Break;
end;
Next;
end;
EnableControls;
end;
end;
procedure TfrFacturaProveedor.VerModal;
begin
if (ContenidoModal is TfrPedidosProveedores) then
(ContenidoModal as TfrPedidosProveedores).CodigoProveedor := CodProveedor.DataBinding.Field.AsString;
inherited;
end;
procedure TfrFacturaProveedor.CodigoPedidoDetalleSetText(Sender: TField;
const Text: String);
begin
CodigoPedido := Text;
end;
procedure TfrFacturaProveedor.ActivarEventosCampos;
begin
with TablaFacturasProveedor do
begin
FieldByName('IVA').OnSetText := IVASetText;
FieldByName('DESCUENTO').OnSetText := DtoSetText;
end;
with TablaDetallesMem do
begin
FieldByName('PRECIO').OnSetText := PrecioDetalleSetText;
FieldByName('CODIGOPEDIDO').OnSetText := CodigoPedidoDetalleSetText;
AfterDelete := DetalleAfterDelete;
end;
end;
procedure TfrFacturaProveedor.DetalleAfterDelete(DataSet: TDataSet);
begin
CalcularTotalFactura;
end;
procedure TfrFacturaProveedor.DtoSetText(Sender: TField;
const Text: String);
begin
if EsCadenaVacia(Text) then
Sender.AsString := '0'
else begin
ValidarDto(Text);
Sender.AsString := Text;
end;
CalcularTotalFactura;
end;
procedure TfrFacturaProveedor.IVASetText(Sender: TField;
const Text: String);
begin
if EsCadenaVacia(Text) then
Sender.AsString := '0'
else begin
ValidarIVA(Text);
Sender.AsString := Text;
end;
CalcularTotalFactura;
end;
function TfrFacturaProveedor.FacturarPedidos: boolean;
begin
Result := True;
with TablaDetallesMem do
begin
DisableControls;
First;
while not EOF do
begin
if (not EsCadenaVacia(FieldByName('CODIGOPEDIDO').AsString)) and
(not dmTablaPedidosProveedor.FacturarPedido(EmpresaActiva.Codigo, FieldByName('CODIGOPEDIDO').AsString, FCodigoFactura))
then begin
Result := False;
Break;
end;
Next;
end;
EnableControls;
end;
end;
procedure TfrFacturaProveedor.CodProveedorPropertiesButtonClick(
Sender: TObject; AButtonIndex: Integer);
begin
ContenidoModal := TfrProveedores.Create(Self);
end;
procedure TfrFacturaProveedor.CodProveedorPropertiesValidate(
Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
var Error: Boolean);
begin
if not (Modo in [Anadir, Modificar]) then
Exit;
if EscadenaVacia(DisplayValue) then
exit;
if (dmTablaProveedores.validarCodigo(DisplayValue)) then begin
//Comprueba que le numero es lo sufucientemente pequeño para ser un entero
if not EsInteger(DisplayValue) then
begin
VerMensajeFmt(msgProCodProvIncorrecto,[DisplayValue]);
DisplayValue := '0';
CodProveedor.SetFocus;
end
else
begin
DisplayValue := dmTablaProveedores.formatearCodigo(DisplayValue);
if (dmTablaProveedores.existeCodigo(DisplayValue)) then
CodigoProveedor := DisplayValue
else begin
VerMensajeFmt(msgProCodProvNoExiste, [DisplayValue]);
Paginas.ActivePage := pagProveedor;
CodProveedor.SetFocus;
end;
end;
end
else begin
VerMensajeFmt(msgProCodProvIncorrecto, [DisplayValue]);
Paginas.ActivePage := pagProveedor;
CodProveedor.SetFocus;
end;
end;
end.