This repository has been archived on 2024-11-28. You can view files and clone it, but cannot push or open issues or pull requests.
LuisLeon_FactuGES/Source/Modulos/Tienda web/Controller/Utiles/uActualizarArticulosUtils.pas
2007-06-11 15:29:06 +00:00

278 lines
8.7 KiB
ObjectPascal
Raw Blame History

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.