git-svn-id: https://192.168.0.254/svn/Proyectos.LuisLeon_FactuGES/trunk@2 c93665c3-c93d-084d-9b98-7d5f4a9c3376
278 lines
8.7 KiB
ObjectPascal
278 lines
8.7 KiB
ObjectPascal
unit uActualizarArticulosUtils;
|
||
|
||
interface
|
||
|
||
uses
|
||
Forms, Classes, Windows, SysUtils,
|
||
uBizTiendaWeb, JSDialog, ExtCtrls;
|
||
|
||
function ActualizarArticulosTienda(ATiendaWeb : IBizTiendaWeb): Boolean;
|
||
|
||
implementation
|
||
|
||
uses
|
||
uArticulosController, uBizArticulos,
|
||
uOscProductsController, uProveedoresController, uOscManufacturersController,
|
||
uBizOscManufacturers, uBizOscProducts,
|
||
uPasswordUtils, schTiendaWebClient_Intf, uDADataTable,
|
||
uBizContactos, uBizDireccionesContacto,
|
||
schContactosClient_Intf, JSDialogs, uDialogUtils, StrUtils, uIntegerListUtils,
|
||
schArticulosClient_Intf;
|
||
|
||
|
||
function AnadirOSCProduct(AOSCProducts : IBizOscProduct; AArticulo : IBizArticulo): Boolean;
|
||
var
|
||
AOSCProductController : IOscProductsController;
|
||
AOSCManufacturersController : TOscManufacturersController;
|
||
AOSCManufacturer : IBizOscManufacturer;
|
||
Resultado : Boolean;
|
||
begin
|
||
Result := True;
|
||
|
||
if not Assigned(AOSCProducts) then
|
||
raise Exception.Create ('OSCProducts no asignado (AnadirOSCProduct)');
|
||
|
||
if not Assigned(AArticulo) then
|
||
raise Exception.Create ('Articulo no asignado (AnadirOSCProduct)');
|
||
|
||
AArticulo.DataTable.Active := True;
|
||
|
||
AOSCProductController := TOscProductsController.Create;
|
||
AOSCProducts.DataTable.Active := True;
|
||
|
||
AOSCManufacturersController := TOscManufacturersController.Create;
|
||
AOSCManufacturer := AOSCManufacturersController.Buscar(AArticulo.ID_PROVEEDOR);
|
||
AOSCManufacturer.DataTable.Active := True;
|
||
if (AOSCManufacturer.DataTable.RecordCount = 0) then
|
||
raise Exception.CreateFmt('No se ha encontrado el proveedor %d en la tienda web (AnadirOSCProduct)', [AArticulo.ID_PROVEEDOR]);
|
||
|
||
try
|
||
AOSCProductController.Anadir(AOSCProducts);
|
||
with AOSCProducts do
|
||
begin
|
||
products_name := AArticulo.DESCRIPCION;
|
||
products_model := AArticulo.REFERENCIA_PROV;
|
||
products_date_added := Now;
|
||
manufacturers_id := AOSCManufacturer.manufacturers_id;
|
||
rdx_products_id_local := AArticulo.ID;
|
||
products_status := 1;
|
||
Post;
|
||
end;
|
||
AOSCProductController.Guardar(AOSCProducts);
|
||
|
||
finally
|
||
AOSCProductController := NIL;
|
||
AOSCManufacturer := NIL;
|
||
AOSCManufacturersController := NIL;
|
||
end;
|
||
end;
|
||
|
||
|
||
function ActualizarOSCProduct(AOSCProducts : IBizOscProduct; AArticulo : IBizArticulo) : Boolean;
|
||
var
|
||
AOSCProductController : IOscProductsController;
|
||
AOSCManufacturersController : TOscManufacturersController;
|
||
AOSCManufacturer : IBizOscManufacturer;
|
||
Resultado : Boolean;
|
||
begin
|
||
Result := True;
|
||
|
||
if not Assigned(AOSCProducts) then
|
||
raise Exception.Create ('OSCProducts no asignado (ActualizarOSCProduct)');
|
||
|
||
if not Assigned(AArticulo) then
|
||
raise Exception.Create ('Art<72>culo no asignado (ActualizarOSCProduct)');
|
||
|
||
AArticulo.DataTable.Active := True;
|
||
|
||
AOSCProductController := TOscProductsController.Create;
|
||
AOSCProducts.DataTable.Active := True;
|
||
|
||
AOSCManufacturersController := TOscManufacturersController.Create;
|
||
AOSCManufacturer := AOSCManufacturersController.Buscar(AArticulo.ID_PROVEEDOR);
|
||
AOSCManufacturer.DataTable.Active := True;
|
||
if (AOSCManufacturer.DataTable.RecordCount = 0) then
|
||
raise Exception.CreateFmt('No se ha encontrado el proveedor %d en la tienda web (ActualizarOSCProduct)', [AArticulo.ID_PROVEEDOR]);
|
||
|
||
try
|
||
if not AOSCProductController.Localizar(AOSCProducts, AArticulo.ID) then
|
||
raise Exception.CreateFmt('No se ha localizado el producto con ID = %d', [AArticulo.ID]);
|
||
|
||
with AOSCProducts do
|
||
begin
|
||
Edit;
|
||
products_name := AArticulo.DESCRIPCION;
|
||
products_model := AArticulo.REFERENCIA_PROV;
|
||
products_last_modified := Now;
|
||
manufacturers_id := AOSCManufacturer.manufacturers_id;
|
||
products_status := 1;
|
||
Post;
|
||
end;
|
||
AOSCProductController.Guardar(AOSCProducts);
|
||
|
||
finally
|
||
AOSCProductController := NIL;
|
||
AOSCManufacturer := NIL;
|
||
AOSCManufacturersController := NIL;
|
||
end;
|
||
end;
|
||
|
||
function HayCambiosPendientes(AArticulo : IBizArticulo; const UltimaSincro : TDateTime): Boolean;
|
||
begin
|
||
if not Assigned(AArticulo) then
|
||
raise Exception.Create ('Art<72>culo no asignado (HayCambiosPendientes)');
|
||
|
||
AArticulo.DataTable.Active := True;
|
||
|
||
Result := (AArticulo.FECHA_MODIFICACION > UltimaSincro);
|
||
end;
|
||
|
||
function ActualizarArticulosTienda(ATiendaWeb : IBizTiendaWeb): Boolean;
|
||
var
|
||
AProveedoresController : IProveedoresController;
|
||
AProveedores : IBizProveedor;
|
||
|
||
AOSCProductController : IOscProductsController;
|
||
AOSCProducts : IBizOscProduct;
|
||
|
||
AArticulosController : IArticulosController;
|
||
AArticulos : IBizArticulo;
|
||
|
||
i : Integer;
|
||
|
||
//ADlg : TJSDialog;
|
||
Resultado : Boolean;
|
||
s : String;
|
||
|
||
AProductList : TIntegerList;
|
||
AIndex : Integer;
|
||
AContadorProv: Integer;
|
||
AContadorArt : Integer;
|
||
begin
|
||
Result := False;
|
||
if not Assigned(ATiendaWeb) then
|
||
raise Exception.Create ('TiendaWeb no asignada');
|
||
|
||
try
|
||
AProveedoresController := TProveedoresController.Create;
|
||
AArticulosController := TArticulosController.Create;
|
||
AOSCProductController := TOscProductsController.Create;
|
||
|
||
AProductList := TIntegerList.Create;
|
||
|
||
{ADlg := TJSDialog.Create(nil);
|
||
with ADlg do
|
||
begin
|
||
Title := 'Actualizaci<63>n de art<72>culos';
|
||
DialogOptions := [doProgressBar, doTopMost];
|
||
ButtonBar.Buttons := [];
|
||
Instruction.Text := 'Actualizando art<72>culos...';
|
||
Content.Text := Format('Progreso: %d%%', [0]);
|
||
Expando.Visible := True;
|
||
Expando.MoreHeight := 200;
|
||
Expando.ShowInFooter := True;
|
||
Expando.ShowText := 'Ver m<>s detalles...';
|
||
Expando.HideText := 'Ocultar detalles...';
|
||
Progress.Max := 100;
|
||
end;}
|
||
|
||
// Recupero todos los proveedores que hay en la tienda
|
||
AProveedores := (AProveedoresController.BuscarTodosTiendaWeb as IBizProveedor);
|
||
AProveedores.DataTable.Active := True;
|
||
AProveedores.DataTable.First;
|
||
|
||
AOSCProducts := AOSCProductController.BuscarTodos;
|
||
AOSCProducts.DataTable.Active := True;
|
||
AOSCProducts.DataTable.First;
|
||
|
||
{if AProveedores.DataTable.RecordCount > 0 then
|
||
ADlg.Progress.Max := AProveedores.DataTable.RecordCount;}
|
||
|
||
for AContadorProv := 0 to AProveedores.DataTable.RecordCount - 1 do
|
||
begin
|
||
// Por cada uno de los proveedores:
|
||
// - Recupero todos los art<72>culos que sirve
|
||
// - Actualizo la tienda
|
||
|
||
AArticulos := AArticulosController.BuscarTodos(AProveedores);
|
||
AArticulos.DataTable.Active := True;
|
||
AArticulos.DataTable.First;
|
||
|
||
for AContadorArt := 0 to AArticulos.DataTable.RecordCount - 1 do
|
||
begin
|
||
Application.ProcessMessages;
|
||
|
||
{with ADlg do
|
||
begin
|
||
Content.Text := Format('Progreso: %d%%', [Progress.Position*100 div ADlg.Progress.Max]);
|
||
UpdateProgress;
|
||
Application.ProcessMessages;
|
||
end;}
|
||
|
||
if not AOSCProductController.Localizar(AOSCProducts, AArticulos.ID) then
|
||
begin
|
||
s := Format('A<>adiendo %15s... ', [AArticulos.DESCRIPCION]);
|
||
Resultado := AnadirOSCProduct(AOSCProducts, AArticulos);
|
||
if Resultado then
|
||
s := s + 'OK'
|
||
else
|
||
s := s + 'Fallo';
|
||
end
|
||
else begin
|
||
if HayCambiosPendientes(AArticulos, ATiendaWeb.ULTIMA_ACTUALIZACION) then
|
||
begin
|
||
s := Format('Actualizando %15s... ', [AArticulos.DESCRIPCION]);
|
||
Resultado := ActualizarOSCProduct(AOSCProducts, AArticulos);
|
||
if Resultado then
|
||
s := s + 'OK'
|
||
else
|
||
s := s + 'Fallo';
|
||
end
|
||
else
|
||
s := Format('%15s... sin cambios', [AArticulos.DESCRIPCION]);
|
||
end;
|
||
|
||
//ADlg.Expando.Lines.Add(s);
|
||
AProductList.Add(AArticulos.ID);
|
||
AArticulos.DataTable.Next;
|
||
end;
|
||
|
||
// Avanzo al siguiente proveedor
|
||
AProveedores.DataTable.Next;
|
||
end;
|
||
|
||
// Ahora hay que eliminar de OSC los art<72>culos que sobran
|
||
AOSCProducts.Last;
|
||
for I := (AOSCProducts.DataTable.RecordCount - 1) downto 0 do
|
||
begin
|
||
Application.ProcessMessages;
|
||
if not AProductList.Find(AOSCProducts.rdx_products_id_local, AIndex) then
|
||
begin
|
||
s := Format('Eliminado %15s... ', [AOSCProducts.products_name]);
|
||
//ADlg.Expando.Lines.Add(s);
|
||
AOSCProducts.Delete;
|
||
end;
|
||
AOSCProducts.Prior;
|
||
end;
|
||
AOSCProductController.Guardar(AOSCProducts);
|
||
|
||
Application.ProcessMessages;
|
||
Result := True;
|
||
finally
|
||
{ADlg.Close;
|
||
FreeAndNIL(ADlg);}
|
||
|
||
FreeAndNIL(AProductList);
|
||
|
||
AProveedoresController := NIL;
|
||
AArticulosController := NIL;
|
||
AOSCProductController := NIL;
|
||
AOSCProducts := NIL;
|
||
AProveedores := NIL;
|
||
AArticulos := NIL;
|
||
end;
|
||
end;
|
||
|
||
|
||
end.
|