unit uGenerarPedidosProvUtils;

interface

uses
  SysUtils, Classes, uBizPedidosCliente, pngimage, JSDialog;

type
  TdmGenerarPedidosProv = class(TDataModule)
    JsListaPedidosGenerados: TJSDialog;
  end;

  function GenerarPedidosProv(const IDPedido : Integer) : Boolean; overload;
  function GenerarPedidosProv(APedidoCli : IBizPedidoCliente) : Boolean; overload;
  function GenerarPedidosProv : Boolean; overload;

implementation

{$R *.dfm}

uses
  uDialogUtils,
  uPedidosClienteController, uPedidosProveedorController, uProveedoresController,
  uDetallesPedidoProveedorController, uControllerDetallesBase,
  uBizPedidosProveedor, uBizContactos, schPedidosProveedorClient_Intf;

var
  dmGenerarPedidosProv: TdmGenerarPedidosProv;
  APedidosClienteController : IPedidosClienteController;
  APedidosProveedorController : IPedidosProveedorController;
  ADetallesPedidosProvController : IDetallesPedidoProveedorController;
  AProveedoresController : IProveedoresController;


procedure Inicializar;
begin
  dmGenerarPedidosProv := TdmGenerarPedidosProv.Create(nil);
  APedidosClienteController := TPedidosClienteController.Create;
  APedidosProveedorController := TPedidosProveedorController.Create;
  ADetallesPedidosProvController := TDetallesPedidoProveedorController.Create;
  AProveedoresController := TProveedoresController.Create;
end;

procedure Finalizar;
begin
  FreeAndNIL(dmGenerarPedidosProv);
  APedidosClienteController := nil;
  APedidosProveedorController := nil;
  ADetallesPedidosProvController := nil;
  AProveedoresController := nil;
end;


function GenerarPedidosProv(const IDPedido : Integer) : Boolean; overload;
var
  APedido : IBizPedidoCliente;
begin
  Result := False;

  try
    if not Assigned(APedidosClienteController) then
       Inicializar;

    APedido := APedidosClienteController.Buscar(IDPedido);
    if Assigned(APedido) then
       Result := GenerarPedidosProv(APedido);
  finally
    if Assigned(APedidosClienteController) then
       Finalizar;
  end;
end;

function GenerarPedidosProv(APedidoCli : IBizPedidoCliente) : Boolean; overload;
var
  APedidoProv : IBizPedidoProveedor;
  AArticulosPend : IBizPedidoClienteArticulosPendientesPedirAProv;
  ALista : TStringList;
begin
  Result := False;

  if not Assigned(APedidoCli) then
    raise Exception.Create('Pedido de cliente no asignado (GenerarPedidosProv)');

  if not APedidoCli.DataTable.Active then
    APedidoCli.DataTable.Active := True;

  if not Assigned(APedidosClienteController) then
     Inicializar;

  AArticulosPend := APedidosClienteController.BuscarPendientesPedir(APedidoCli.ID);
  if not Assigned(AArticulosPend) then
    raise Exception.Create('Error al recuperar la lista de artículos pendientes de pedir (GenerarPedidosProv)');

  ALista := TStringList.Create;
  try
    if not AArticulosPend.DataTable.Active then
      AArticulosPend.DataTable.Active := True;

    if AArticulosPend.DataTable.RecordCount = 0 then
    begin
      ShowInfoMessage('Este pedido a cliente no tiene artículos pendientes que se tengan que pedir a los proveedores');
      Exit;
    end;

    APedidoProv := NIL;
    AArticulosPend.DataTable.First;
    while not AArticulosPend.DataTable.EOF do
    begin
      if Assigned(APedidoProv) and
        (AArticulosPend.ID_PROVEEDOR <> APedidoProv.ID_PROVEEDOR) then
      begin
        APedidosProveedorController.Guardar(APedidoProv);
        ALista.Add(APedidoProv.REFERENCIA + ': ' + APedidoProv.NOMBRE);
        APedidoProv := NIL;
      end;

      if not Assigned(APedidoProv) then
      begin
        APedidoProv := APedidosProveedorController.Nuevo;
        APedidoProv.Edit;
        APedidoProv.Proveedor := (AProveedoresController.Buscar(AArticulosPend.ID_PROVEEDOR) as IBizProveedor);
        APedidoProv.ID_PEDIDO_CLIENTE := APedidoCli.ID;
      end;

      //OJO IMPORTANTE
      //Siempre que vayamos a trabajar con los detalles debemos hacer un beginupdate de los mismos y un endupdate para
      //obligarle siempre a recalcular los detalles una sola vez
      ADetallesPedidosProvController.BeginUpdate(APedidoProv.Detalles);

      ADetallesPedidosProvController.Add(APedidoProv.Detalles, TIPO_DETALLE_CONCEPTO);
      ADetallesPedidosProvController.AnadirArticulo(APedidoProv.Detalles, AArticulosPend.ID_ARTICULO);
      with APedidoProv.Detalles do
      begin
        Edit;
        CANTIDAD := AArticulosPend.CANT_PENDIENTE_PEDIR;
        Post;
      end;
      ADetallesPedidosProvController.EndUpdate(APedidoProv.Detalles);
      AArticulosPend.DataTable.Next;
    end;

    if Assigned(APedidoProv) then
    begin
      APedidosProveedorController.Guardar(APedidoProv);
      ALista.Add(APedidoProv.REFERENCIA + ': ' + APedidoProv.NOMBRE);
      APedidoProv := NIL;
    end;

    if ALista.Count > 0 then
    begin
      dmGenerarPedidosProv.JsListaPedidosGenerados.Content.Clear;
      dmGenerarPedidosProv.JsListaPedidosGenerados.Content.AddStrings(ALista);
      dmGenerarPedidosProv.JsListaPedidosGenerados.Execute;
    end;

    Result := True;
  finally
    FreeAndNIL(ALista);
    AArticulosPend := NIL;

    if Assigned(APedidosClienteController) then
       Finalizar;
  end;
end;

function GenerarPedidosProv : Boolean; overload;
var
  APedidoCli : IBizPedidoCliente;
begin
  Result := False;
  try
    if not Assigned(APedidosClienteController) then
       Inicializar;

    APedidoCli := APedidosClienteController.ElegirPedidos(APedidosClienteController.BuscarPendientes,
                  'Elija el pedido de cliente que desea utilizar para dar de alta el pedido o pedidos a proveedor.'
                  , False);

    if Assigned(APedidoCli) then
       Result := GenerarPedidosProv(APedidoCli);
  finally
    if Assigned(APedidosClienteController) then
       Finalizar;
  end;
end;

end.
