This repository has been archived on 2024-12-02. You can view files and clone it, but cannot push or open issues or pull requests.
FactuGES/Sincronizacion.pas
2007-06-26 08:08:27 +00:00

803 lines
22 KiB
ObjectPascal
Raw Permalink Blame History

unit Sincronizacion;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, RdxBotones, RdxBarras, ExtCtrls, RdxPaneles, OleServer,
OutlookXP, DB, IBCustomDataSet, StdCtrls, TablaProveedores,
TablaClientes, TablaAgenda, CETools;
type
tContactos = (tcProveedores, tcClientes);
TfSincronizacion = class(TForm)
BarraContadores: TRdxBarraSuperior;
imgSombra: TImage;
brInferior: TRdxBarraInferior;
bCerrar: TRdxBoton;
Outlook: TOutlookApplication;
Label1: TLabel;
eProgress1: TLabel;
eFechaUltimaSinc: TLabel;
Label2: TLabel;
eProgress2: TLabel;
Image1: TImage;
Image2: TImage;
Image3: TImage;
Label3: TLabel;
CEDeviceInfo: TCEDeviceInfo;
Image4: TImage;
Label4: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormActivate(Sender: TObject);
procedure CEDeviceInfoConnectError(Sender: TObject);
private
ContactsFolder: MAPIFolder;
CalendarFolder: MAPIFolder;
NmSpace: NameSpace;
FTablaContactos : TIBDataSet;
FTablaAgenda : TIBDataSet;
FUltimaSincronizacion : TDateTime;
FCategoriaClientes : String;
FCategoriaProveedores : String;
function DarUltimaSincronizacion : TDateTime;
procedure ActualizarFechaSincronizacion;
procedure Sincronizar;
procedure SincronizarContactos (TipoContacto : tContactos);
procedure SincronizarAgenda;
procedure AnadirClientesNuevos;
procedure AnadirProveedoresNuevos;
procedure EliminarClientesSobrantes;
procedure EliminarProveedoresSobrantes;
procedure InsertarProveedorBD (Contacto : TContactItem;
Proveedor : TDatosProveedor);
procedure InsertarClienteBD (Contacto : TContactItem;
Cliente : TDatosCliente);
procedure ActualizarProveedorOutlook (Contacto : TContactItem;
Proveedor : TDatosProveedor);
procedure ActualizarProveedorBD (Contacto : TContactItem;
Proveedor : TDatosProveedor);
procedure ActualizarClienteOutlook (Contacto : TContactItem;
Cliente : TDatosCliente);
procedure ActualizarClienteBD (Contacto : TContactItem;
Cliente : TDatosCliente);
public
{ Public declarations }
end;
var
fSincronizacion: TfSincronizacion;
implementation
{$R *.dfm}
uses
IBSQL, Framework, BaseDatos, Mensajes, StrFunc, RdxEmpresaActiva, IBQuery,
SincronizarCalendario;
procedure TfSincronizacion.ActualizarClienteBD(Contacto: TContactItem;
Cliente: TDatosCliente);
var
Cadena : String;
begin
with Contacto, Cliente do
begin
if FullName <> Nombre then
Nombre := FullName;
if not EsCadenaVacia(Calle) then
begin
Cadena := Calle;
if not EsCadenaVacia(Numero) then
Cadena := Cadena + ', ' + Numero;
if not EsCadenaVacia(Piso) then
Cadena := Cadena + ' ' + Piso;
end;
if Cadena <> BusinessAddressStreet then
begin
Calle := BusinessAddressStreet;
Piso := '';
Numero := '';
end;
if BusinessAddressPostalCode <> CodigoPostal then
CodigoPostal := BusinessAddressPostalCode;
if BusinessAddressCity <> Poblacion then
Poblacion := BusinessAddressCity;
if BusinessAddressState <> Provincia then
Provincia := BusinessAddressState;
if Email1Address <> Correo then
Correo := Email1Address;
if BusinessTelephoneNumber <> Telefono1 then
Telefono1 := BusinessTelephoneNumber;
if Business2TelephoneNumber <> Telefono2 then
Telefono2 := Business2TelephoneNumber;
if BusinessFaxNumber <> Fax then
Fax := BusinessFaxNumber;
if MobileTelephoneNumber <> Movil1 then
Movil1 := MobileTelephoneNumber;
if HomeTelephoneNumber <> Movil2 then
Movil2 := HomeTelephoneNumber;
if Body <> Observaciones then
Observaciones := Body;
SalvarDatos;
end;
end;
procedure TfSincronizacion.ActualizarClienteOutlook(Contacto: TContactItem;
Cliente: TDatosCliente);
begin
with Contacto, Cliente do
begin
CustomerID := Codigo;
FullName := Nombre;
FileAs := FullName;
if not EsCadenaVacia(Calle) then
begin
BusinessAddressStreet := Calle;
if not EsCadenaVacia(Numero) then
BusinessAddressStreet := BusinessAddressStreet + ', ' + Numero;
if not EsCadenaVacia(Piso) then
BusinessAddressStreet := BusinessAddressStreet + ' ' + Piso;
end;
BusinessAddressPostalCode := CodigoPostal;
BusinessAddressCity := Poblacion;
BusinessAddressState := Provincia;
Email1Address := Correo;
BusinessTelephoneNumber := Telefono1;
Business2TelephoneNumber := Telefono2;
BusinessFaxNumber := Fax;
MobileTelephoneNumber := Movil1;
HomeTelephoneNumber := Movil2;
Body := Observaciones;
Categories := FCategoriaClientes;
Save;
end;
end;
procedure TfSincronizacion.ActualizarProveedorBD(Contacto: TContactItem;
Proveedor: TDatosProveedor);
var
Cadena : String;
begin
with Contacto, Proveedor do
begin
if FullName <> Nombre then
Nombre := FullName;
if not EsCadenaVacia(Calle) then
begin
Cadena := Calle;
if not EsCadenaVacia(Numero) then
Cadena := Cadena + ', ' + Numero;
if not EsCadenaVacia(Piso) then
Cadena := Cadena + ' ' + Piso;
end;
if Cadena <> BusinessAddressStreet then
begin
Calle := BusinessAddressStreet;
Piso := '';
Numero := '';
end;
if BusinessAddressPostalCode <> CodigoPostal then
CodigoPostal := BusinessAddressPostalCode;
if BusinessAddressCity <> Poblacion then
Poblacion := BusinessAddressCity;
if BusinessAddressState <> Provincia then
Provincia := BusinessAddressState;
if Email1Address <> Correo then
Correo := Email1Address;
if BusinessTelephoneNumber <> Telefono1 then
Telefono1 := BusinessTelephoneNumber;
if Business2TelephoneNumber <> Telefono2 then
Telefono2 := Business2TelephoneNumber;
if BusinessFaxNumber <> Fax then
Fax := BusinessFaxNumber;
if MobileTelephoneNumber <> Movil1 then
Movil1 := MobileTelephoneNumber;
if HomeTelephoneNumber <> Movil2 then
Movil2 := HomeTelephoneNumber;
if Body <> Observaciones then
Observaciones := Body;
SalvarDatos;
end;
end;
procedure TfSincronizacion.ActualizarProveedorOutlook(
Contacto: TContactItem; Proveedor : TDatosProveedor);
begin
with Contacto, Proveedor do
begin
CustomerID := Codigo;
FullName := Nombre;
FileAs := FullName;
if not EsCadenaVacia(Calle) then
begin
BusinessAddressStreet := Calle;
if not EsCadenaVacia(Numero) then
BusinessAddressStreet := BusinessAddressStreet + ', ' + Numero;
if not EsCadenaVacia(Piso) then
BusinessAddressStreet := BusinessAddressStreet + ' ' + Piso;
end;
BusinessAddressPostalCode := CodigoPostal;
BusinessAddressCity := Poblacion;
BusinessAddressState := Provincia;
Email1Address := Correo;
BusinessTelephoneNumber := Telefono1;
Business2TelephoneNumber := Telefono2;
BusinessFaxNumber := Fax;
MobileTelephoneNumber := Movil1;
HomeTelephoneNumber := Movil2;
Body := Observaciones;
Categories := FCategoriaProveedores;
Save;
end;
end;
procedure TfSincronizacion.FormCreate(Sender: TObject);
var
DLLHandle: THandle;
begin
FTablaContactos := NIL;
FTablaAgenda := NIL;
try
Outlook.Connect;
NmSpace := Outlook.GetNamespace('MAPI');
NmSpace.Logon('', '', False, False);
ContactsFolder := NmSpace.GetDefaultFolder(olFolderContacts);
CalendarFolder := NmSpace.GetDefaultFolder(olFolderCalendar);
DLLHandle := LoadLibrary('RAPI.DLL');
if DLLHandle < 32 then
raise SysUtils.Exception.Create('');
except
raise SysUtils.Exception.Create('Microsoft ActiveSync no est<73> instalado.');
end;
FTablaContactos := TIBDataSet.Create(Self);
with FTablaContactos do
begin
Database := dmBaseDatos.BD;
Transaction := dmBaseDatos.Transaccion;
end;
FTablaAgenda := TIBDataSet.Create(Self);
with FTablaAgenda do
begin
Database := dmBaseDatos.BD;
Transaction := dmBaseDatos.Transaccion;
end;
FUltimaSincronizacion := DarUltimaSincronizacion;
FCategoriaClientes := dmBaseDatos.DarValorConfiguracion('CAT_PPC_CLIENTES');
FCategoriaProveedores := dmBaseDatos.DarValorConfiguracion('CAT_PPC_PROVEEDORES');
if EsCadenaVacia(FCategoriaClientes) or EsCadenaVacia(FCategoriaProveedores) then
raise SysUtils.Exception.Create('No est<73>n definidas las categor<6F>as de los contactos para el PocketPC.');
end;
procedure TfSincronizacion.FormDestroy(Sender: TObject);
begin
dmBaseDatos.Rollback;
if Assigned (FTablaContactos) then
begin
FTablaContactos.Close;
FTablaContactos.Free;
end;
FTablaContactos := NIL;
if Assigned (FTablaAgenda) then
begin
FTablaAgenda.Close;
FTablaAgenda.Free;
end;
FTablaAgenda := NIL;
NmSpace.Logoff;
Outlook.Disconnect;
end;
procedure TfSincronizacion.FormShow(Sender: TObject);
begin
eFechaUltimaSinc.Caption := 'Ultima sincronizaci<63>n: ' + VarToStr(FUltimaSincronizacion);
end;
procedure TfSincronizacion.EliminarClientesSobrantes;
var
Contacto : TContactItem;
Filter: Widestring;
Id: IDispatch;
Total : Integer;
Contador : Integer;
DatosContacto : TObjeto;
Clientes : Items;
begin
Clientes := ContactsFolder.Items.Restrict('[Categor<6F>as] = "' + FCategoriaClientes + '"');
Contacto := TContactItem.Create(Self);
FTablaContactos.Open;
FTablaContactos.Last;
try
Contacto.ConnectKind := ckRunningOrNew;
Total := Clientes.Count - FTablaContactos.RecordCount;
Id := Clientes.GetLast;
if Total > 0 then
begin
Contador := 0;
while (Contador < Total) and Assigned(Id) do
begin
FTablaContactos.First;
Contacto.ConnectTo(Id as ContactItem);
if not FTablaContactos.Locate('CODIGO', Contacto.CustomerID, []) then
begin
Contacto.Delete;
Contador := Contador + 1;
end;
Id := Clientes.GetPrevious;
end;
end;
finally
FTablaContactos.Close;
Contacto.Free;
end;
end;
procedure TfSincronizacion.SincronizarContactos(TipoContacto : tContactos);
var
Contacto : TContactItem;
Filter: Widestring;
Id: IDispatch;
Contador : Integer;
DatosContacto : TObjeto;
begin
Contador := 0;
FTablaContactos.Open;
with FTablaContactos do
begin
Last;
First;
while not EOF do
begin
if TipoContacto = tcProveedores then
eProgress1.Caption := IntToStr(Contador) + ' proveedores sincronizados.'
else
eProgress2.Caption := IntToStr(Contador) + ' clientes sincronizados.';
Self.Refresh;
Application.ProcessMessages;
Filter :='[CustomerID] = "' + FieldByName('CODIGO').AsString + '"';
Id := ContactsFolder.Items.Find(Filter);
if (Id = nil) then
begin
Contacto := TContactItem.Create(Self);
Contacto.ConnectKind := ckRunningOrNew;
Contacto.ConnectTo(ContactsFolder.Items.Add(olContactItem) as _ContactItem);
try
if TipoContacto = tcProveedores then
begin
DatosContacto := TDatosProveedor.Create(FieldByName('CODIGO').AsString);
ActualizarProveedorOutlook(Contacto, DatosContacto as TDatosProveedor);
end
else begin
DatosContacto := TDatosCliente.Create(FieldByName('CODIGO').AsString);
ActualizarClienteOutlook(Contacto, DatosContacto as TDatosCliente);
end;
finally
Contacto.Free;
DatosContacto.Free;
end;
end
else begin
Contacto := TContactItem.Create(Self);
try
Contacto.ConnectKind := ckRunningOrNew;
Contacto.ConnectTo(Id as ContactItem);
if (Contacto.LastModificationTime > FUltimaSincronizacion) or
(FTablaContactos.FieldByName('ULTIMOCAMBIO').AsDateTime > FUltimaSincronizacion) then
begin
Contador := Contador + 1;
if TipoContacto = tcProveedores then
begin
DatosContacto := TDatosProveedor.Create(FieldByName('CODIGO').AsString);
if (Contacto.LastModificationTime > FieldByName('ULTIMOCAMBIO').AsDateTime) then
ActualizarProveedorBD(Contacto, DatosContacto as TDatosProveedor)
else
ActualizarProveedorOutlook(Contacto, DatosContacto as TDatosProveedor);
end
else begin
DatosContacto := TDatosCliente.Create(FieldByName('CODIGO').AsString);
if (Contacto.LastModificationTime > FieldByName('ULTIMOCAMBIO').AsDateTime) then
ActualizarClienteBD(Contacto, DatosContacto as TDatosCliente)
else
ActualizarClienteOutlook(Contacto, DatosContacto as TDatosCliente);
end;
DatosContacto.Free;
end;
finally
Contacto.Free;
end;
end;
Contador := Contador + 1;
Next;
end;
end;
if TipoContacto = tcProveedores then
eProgress1.Caption := IntToStr(Contador) + ' proveedores sincronizados.'
else
eProgress2.Caption := IntToStr(Contador) + ' clientes sincronizados.';
FTablaContactos.Close;
end;
procedure TfSincronizacion.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
end;
procedure TfSincronizacion.FormActivate(Sender: TObject);
begin
OnActivate := NIL;
Sincronizar;
end;
procedure TfSincronizacion.AnadirClientesNuevos;
var
Contacto : TContactItem;
Id: IDispatch;
DatosContacto : TObjeto;
Clientes : Items;
DatosCliente : TDatosCliente;
begin
Clientes := ContactsFolder.Items.Restrict('[Categor<6F>as] = "' + FCategoriaClientes + '"');
Contacto := TContactItem.Create(Self);
try
Contacto.ConnectKind := ckRunningOrNew;
Id := Clientes.GetFirst;
while Assigned(Id) do
begin
Contacto.ConnectTo(Id as ContactItem);
if EsCadenaVacia(Contacto.CustomerID) then
begin
DatosCliente := TDatosCliente.Create;
try
InsertarClienteBD(Contacto, DatosCliente);
ActualizarClienteOutlook(Contacto, DatosCliente);
finally
DatosCliente.Free;
end;
end;
Id := Clientes.GetNext;
end;
finally
Contacto.Free;
end;
end;
procedure TfSincronizacion.InsertarClienteBD(Contacto: TContactItem;
Cliente: TDatosCliente);
begin
with Contacto, Cliente do
begin
Nombre := FullName;
Calle := BusinessAddressStreet;
Piso := '';
Numero := '';
CodigoPostal := BusinessAddressPostalCode;
Poblacion := BusinessAddressCity;
Provincia := BusinessAddressState;
Correo := Email1Address;
Telefono1 := BusinessTelephoneNumber;
Telefono2 := Business2TelephoneNumber;
Fax := BusinessFaxNumber;
Movil1 := MobileTelephoneNumber;
Movil2 := HomeTelephoneNumber;
Observaciones := Body;
SalvarDatos;
end;
end;
procedure TfSincronizacion.InsertarProveedorBD(Contacto: TContactItem;
Proveedor: TDatosProveedor);
begin
with Contacto, Proveedor do
begin
Nombre := FullName;
Calle := BusinessAddressStreet;
Piso := '';
Numero := '';
CodigoPostal := BusinessAddressPostalCode;
Poblacion := BusinessAddressCity;
Provincia := BusinessAddressState;
Correo := Email1Address;
Telefono1 := BusinessTelephoneNumber;
Telefono2 := Business2TelephoneNumber;
Fax := BusinessFaxNumber;
Movil1 := MobileTelephoneNumber;
Movil2 := HomeTelephoneNumber;
Observaciones := Body;
SalvarDatos;
end;
end;
procedure TfSincronizacion.AnadirProveedoresNuevos;
var
Contacto : TContactItem;
Id: IDispatch;
DatosContacto : TObjeto;
Proveedores : Items;
DatosProveedor : TDatosProveedor;
begin
Proveedores := ContactsFolder.Items.Restrict('[Categor<6F>as] = "' + FCategoriaProveedores + '"');
Contacto := TContactItem.Create(Self);
try
Contacto.ConnectKind := ckRunningOrNew;
Id := Proveedores.GetFirst;
while Assigned(Id) do
begin
Contacto.ConnectTo(Id as ContactItem);
if EsCadenaVacia(Contacto.CustomerID) then
begin
DatosProveedor := TDatosProveedor.Create;
try
InsertarProveedorBD(Contacto, DatosProveedor);
ActualizarProveedorOutlook(Contacto, DatosProveedor);
finally
DatosProveedor.Free;
end;
end;
Id := Proveedores.GetNext;
end;
finally
Contacto.Free;
end;
end;
procedure TfSincronizacion.EliminarProveedoresSobrantes;
var
Contacto : TContactItem;
Filter: Widestring;
Id: IDispatch;
Total : Integer;
Contador : Integer;
DatosContacto : TObjeto;
Proveedores : Items;
begin
Proveedores := ContactsFolder.Items.Restrict('[Categor<6F>as] = "' + FCategoriaProveedores + '"');
Contacto := TContactItem.Create(Self);
FTablaContactos.Open;
FTablaContactos.Last;
try
Contacto.ConnectKind := ckRunningOrNew;
Total := Proveedores.Count - FTablaContactos.RecordCount;
Id := Proveedores.GetLast;
if Total > 0 then
begin
Contador := 0;
while (Contador < Total) and Assigned(Id) do
begin
FTablaContactos.First;
Contacto.ConnectTo(Id as ContactItem);
if not FTablaContactos.Locate('CODIGO', Contacto.CustomerID, []) then
begin
Contacto.Delete;
Contador := Contador + 1;
end;
Id := Proveedores.GetPrevious;
end;
end;
finally
FTablaContactos.Close;
Contacto.Free;
end;
end;
function TfSincronizacion.DarUltimaSincronizacion: TDateTime;
var
oSQL : TIBQuery;
begin
oSQL := TIBQuery.Create(Self);
with oSQL do
begin
Database := dmBaseDatos.BD;
Transaction := dmBaseDatos.Transaccion;
SQL.Add('select ULTIMASINCRONIZACION ');
SQL.Add('from USUARIOS ');
SQL.Add('where UPPER(USUARIO) = UPPER(:USUARIO)');
ParamByName('USUARIO').AsString := dmBaseDatos.Usuario;
try
Prepare;
Open;
Result := FieldByName('ULTIMASINCRONIZACION').AsDateTime;
finally
Close;
Transaction := NIL;
Free;
end;
end;
end;
procedure TfSincronizacion.ActualizarFechaSincronizacion;
var
oSQL : TIBSQL;
begin
oSQL := TIBSQL.Create(nil);
with oSQL do
begin
Database := dmBaseDatos.BD;
Transaction := dmBaseDatos.Transaccion;
SQL.Add('update USUARIOS set ');
SQL.Add('ULTIMASINCRONIZACION = CURRENT_TIME ');
SQL.Add('where UPPER(USUARIO) = UPPER(:USUARIO)');
ParamByName('USUARIO').AsString := dmBaseDatos.Usuario;
try
Prepare;
ExecQuery;
finally
Close;
Transaction := NIL;
Free;
end;
end;
end;
procedure TfSincronizacion.SincronizarAgenda;
var
CitaItem : TAppointmentItem;
AppItem : AppointmentItem;
Filter: Widestring;
Id: IDispatch;
Citas : Items;
i, Contador : Integer;
DatosVisita : TDatosVisita;
StoreID : OleVariant;
SincCal : TSincCalendario;
begin
Contador := 0;
SincCal := TSincCalendario.Create(Self);
try
SincCal.CalendarioBD := FTablaAgenda;
SincCal.UltimaSincronizacion := FUltimaSincronizacion;
SincCal.Sincronizar;
finally
SincCal.Free;
end;
end;
procedure TfSincronizacion.CEDeviceInfoConnectError(Sender: TObject);
begin
ShowMessage('No se ha podido conectar con el PocketPC.' + #10#13 + 'No se realizar<61> la sincronizaci<63>n');
end;
procedure TfSincronizacion.Sincronizar;
begin
Screen.Cursor := crHourGlass;
Self.Refresh;
Application.ProcessMessages;
CEDeviceInfo.Open; // Conectar con el PPC;
if not CEDeviceInfo.Connected then
begin
bCerrar.Enabled := True;
Self.Refresh;
Screen.Cursor := crDefault;
Close;
Application.ProcessMessages;
Exit;
end;
Image4.Visible := True;
// Sincronizar los contactos
AnadirProveedoresNuevos;
AnadirClientesNuevos;
with FTablaContactos do
begin
Close;
SelectSQL.Clear;
SelectSQL.Add('select * from proveedores order by codigo');
Prepare;
end;
SincronizarContactos(tcProveedores);
EliminarProveedoresSobrantes;
Image1.Visible := True;
Self.Refresh;
Application.ProcessMessages;
with FTablaContactos do
begin
Close;
Database := dmBaseDatos.BD;
Transaction := dmBaseDatos.Transaccion;
SelectSQL.Clear;
SelectSQL.Add('select first 100 CLIENTES.CODIGO, CLIENTES.NIFCIF, CLIENTES.NOMBRE, PROCEDENCIA, VENDEDOR, ');
SelectSQL.Add('CALLE, NUMERO, PISO, CODIGOPOSTAL, POBLACION, PROVINCIA, ');
SelectSQL.Add('TELEFONO1, TELEFONO2, MOVIL1, MOVIL2, FAX, CORREO, ');
SelectSQL.Add('PERSONACONTACTO, OBSERVACIONES, ULTIMOCAMBIO ');
SelectSQL.Add('from CLIENTES left join SUCURSALESCLIENTE on ');
SelectSQL.Add('(SUCURSALESCLIENTE.CODIGOCLIENTE = CLIENTES.CODIGO and ');
SelectSQL.Add('SUCURSALESCLIENTE.TIPO = ''P'') ');
SelectSQL.Add('order by CLIENTES.FECHAALTA DESC, CLIENTES.CODIGO desc');
Prepare;
end;
SincronizarContactos(tcClientes);
EliminarClientesSobrantes;
Image2.Visible := True;
// Sincronizar la agenda (calendario)
with FTablaAgenda do
begin
Close;
SelectSQL.Clear;
SelectSQL.Add('select * from AGENDA ');
SelectSQL.Add('where UPPER(USUARIO) = UPPER(:USUARIO) ');
SelectSQL.Add('order by FECHAALTA');
with DeleteSQL do
begin
Add('delete from AGENDA ');
Add('where (CODIGO = :CODIGO)');
end;
ParamByName('USUARIO').AsString := dmBaseDatos.Usuario;
Prepare;
end;
SincronizarAgenda;
// Fin
CEDeviceInfo.Close; // desconectar con el PPC;
ActualizarFechaSincronizacion;
FUltimaSincronizacion := DarUltimaSincronizacion;
dmBaseDatos.Commit;
Image3.Visible := True;
bCerrar.Enabled := True;
Self.Refresh;
Application.ProcessMessages;
Screen.Cursor := crDefault;
end;
end.