unit uGenerarPedidosProvUtils;

interface

uses
 Windows, SysUtils, Classes, pngimage, JSDialog,
 uBizContratosCliente, uBizPedidosProveedor;

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

  function GenerarPedidoProv(const IDContrato : Integer; ACopiarDetalles: Boolean) : Boolean; overload;
  function GenerarPedidoProv(AContrato : IBizContratoCliente; var APedido: IBizPedidoProveedor; ACopiarDetalles: Boolean) : Boolean; overload;
//  function ElegirPedidoYGenerarAlbaranCli(var IDAlbaran: Integer) : Boolean;
//  function ElegirContratoYGenerarAlbaranCli(var IDAlbaran: Integer) : Boolean;

implementation

{$R *.dfm}

uses
  uDialogUtils, uBizDetallesContratoCliente, uBizDetallesPedidoProveedor,
  uContratosClienteController, uPedidosProveedorController, uClientesController,
  uDetallesPedidoProveedorController, uControllerDetallesBase,
  uBizContactos, schPedidosProveedorClient_Intf,
  schContratosClienteClient_Intf, uBizDetallesPresupuestoCliente;

var
  dmGenerarPedidosProv: TdmGenerarPedidosProv;
  AContratosClienteController : IContratosClienteController;
  APedidosProveedorController : IPedidosProveedorController;
  AClientesController : IClientesController;

{ Métodos auxiliares }
procedure CopiarContratoAPedido(AContrato: IBizContratoCliente; APedido : IBizPedidoProveedor);
begin
  if not Assigned(APedido) then
    raise Exception.Create ('Pedido no asignado (CopiarContratoAPedido)');

  if not Assigned(AContrato) then
    raise Exception.Create ('Contrato no asignado (CopiarContratoAPedido)');

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

  // El pedido tiene que venir ya abierto y posicionado donde hay que copiar
  APedido.ID_CONTRATO_CLIENTE := AContrato.ID;
  // Lo dejamos listo para que se localize la subcuenta contable asociada al cliente
//  APedidosProveedorController.RecuperarCliente(APedido);
//  APedido.Cliente.Open;

//  APedido.NIF_CIF := AContrato.NIF_CIF;
  APedido.ID_ALMACEN := 0;
  APedido.ID_DIRECCION_CLIENTE := 0;

  APedido.NOMBRE_CLIENTE := AContrato.NOMBRE;
  APedido.CALLE := AContrato.CALLE;
  APedido.POBLACION := AContrato.POBLACION;
  APedido.PROVINCIA := AContrato.PROVINCIA;
  APedido.CODIGO_POSTAL := AContrato.CODIGO_POSTAL;
  APedido.PERSONA_CONTACTO := AContrato.PERSONA_CONTACTO;
  APedido.TELEFONO := AContrato.TELEFONO;
  APedido.DESCRIPCION_GENERAL := AContrato.REFERENCIA_CLIENTE;

  //  APedido.DataTable.FieldByName(fld_FacturasClientePLAZO_ENTREGA).AsVariant := AContrato.DataTable.FieldByName(fld_ContratosClientePLAZO_ENTREGA).AsVariant;

//  APedido.DataTable.FieldByName(fld_AlbaranesClienteOBSERVACIONES).AsVariant := AContrato.DataTable.FieldByName(fld_ContratosClienteOBSERVACIONES).AsVariant;
//  APedido.IMPORTE_NETO := AContrato.IMPORTE_NETO;
//  APedido.IMPORTE_PORTE := AContrato.IMPORTE_PORTE;
//  APedido.DESCUENTO := AContrato.DESCUENTO;
//  APedido.IMPORTE_DESCUENTO := AContrato.IMPORTE_DESCUENTO;
//  APedido.BASE_IMPONIBLE := AContrato.BASE_IMPONIBLE;
//  APedido.ID_TIPO_IVA := AContrato.ID_TIPO_IVA;
//  APedido.IVA := AContrato.IVA;
//  APedido.IMPORTE_IVA := AContrato.IMPORTE_IVA;
//  APedido.IMPORTE_TOTAL := AContrato.IMPORTE_TOTAL;
//  APedido.ID_TIENDA := AContrato.ID_TIENDA;
//  APedido.ID_VENDEDOR := AContrato.ID_VENDEDOR;
//  APedido.RECARGO_EQUIVALENCIA := AContrato.RECARGO_EQUIVALENCIA;
//  APedido.RE := AContrato.RE;
//  APedido.IMPORTE_RE := AContrato.IMPORTE_RE;
//  APedido.TIPO_FACTURA := AContrato.TIPO_CONTRATO;
end;

procedure CopiarDetallesAPedido(
  AContrato: IBizContratoCliente;
  APedido: IBizPedidoProveedor;
  AArticulos: IBizDetallesContratoCliente);
var
  i : integer;
  ADetalles : IBizDetallesPedidoProveedor;
  ADetallesController : IDetallesPedidoProveedorController;
begin
  if not Assigned(APedido) then
    raise Exception.Create ('Albarán no asignada (CopiarDetallesAPedido)');

  if not Assigned(AContrato) then
    raise Exception.Create ('Contrato no asignado (CopiarDetallesAPedido)');

  if not Assigned(AArticulos) then
    raise Exception.Create ('Artículos no asignado (CopiarDetallesAPedido)');

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

  // El contrato tiene que venir ya abierto y posicionado donde hay que copiar

  ADetalles := APedido.Detalles;
  ADetallesController := TDetallesPedidoProveedorController.Create;
  try
    //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
    ADetallesController.BeginUpdate(ADetalles);

    AArticulos.DataTable.First;
    for i := 0 to AArticulos.DataTable.RecordCount - 1 do
    begin
      if (AArticulos.TIPO_DETALLE = TIPO_DETALLE_CONCEPTO) then
      begin
        ADetallesController.Add(ADetalles, AArticulos.TIPO_DETALLE);
        ADetalles.Edit;
  //      ADetalles.REFERENCIA := AArticulos.REFERENCIA;
        ADetalles.ID_ARTICULO := AArticulos.ID_ARTICULO;
        if (AArticulos.PROPIEDAD <> '') then
          ADetalles.CONCEPTO := AArticulos.PROPIEDAD + ': '+ AArticulos.CONCEPTO
        else
          ADetalles.CONCEPTO := AArticulos.CONCEPTO;

        if not AArticulos.CANTIDADIsNull then
           ADetalles.CANTIDAD := AArticulos.CANTIDAD;
        if not AArticulos.IMPORTE_UNIDADIsNull then
           ADetalles.IMPORTE_UNIDAD := AArticulos.IMPORTE_UNIDAD;
        if not AArticulos.IMPORTE_TOTALIsNull then
           ADetalles.IMPORTE_TOTAL := AArticulos.IMPORTE_TOTAL;
        if not AArticulos.DESCUENTOIsNull then
           ADetalles.DESCUENTO := AArticulos.DESCUENTO;
        if not AArticulos.IMPORTE_PORTEIsNull then
           ADetalles.IMPORTE_PORTE := AArticulos.IMPORTE_PORTE;
        ADetalles.VISIBLE := AArticulos.VISIBLE;
  //      ADetalles.REFERENCIA_PROVEEDOR := AArticulos.REFERENCIA_PROVEEDOR;
        ADetalles.Post;
      end;
      AArticulos.Next;
    end;
  finally
    ADetallesController.EndUpdate(ADetalles);
    ADetallesController := NIL;
  end;
end;

procedure Inicializar;
begin
  dmGenerarPedidosProv := TdmGenerarPedidosProv.Create(nil);
  AContratosClienteController := TContratosClienteController.Create;
  APedidosProveedorController := TPedidosProveedorController.Create;
  AClientesController := TClientesController.Create;
end;

procedure Finalizar;
begin
  FreeAndNIL(dmGenerarPedidosProv);
  AContratosClienteController := nil;
  APedidosProveedorController := nil;
  AClientesController := nil;
end;


function GenerarPedidoProv(const IDContrato : Integer; ACopiarDetalles: Boolean) : Boolean; overload;
var
  AContrato : IBizContratoCliente;
  APedido : IBizPedidoProveedor;
begin
  Result := False;

  try
    if not Assigned(AContratosClienteController) then
       Inicializar;

    AContrato := AContratosClienteController.Buscar(IDContrato);
    if Assigned(AContrato) then
       Result := GenerarPedidoProv(AContrato, APedido, ACopiarDetalles);
  finally
    if Assigned(AContratosClienteController) then
       Finalizar;
  end;
end;


function GenerarPedidoProv(AContrato : IBizContratoCliente; var APedido: IBizPedidoProveedor; ACopiarDetalles: Boolean) : Boolean; overload;
var
  ARespuesta : Integer;
begin
  APedido := NIL;

  if not Assigned(AContrato) then
    raise Exception.Create('Contrato de cliente no asignado (GenerarPedidoProv)');

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

  if not Assigned(AContratosClienteController) then
     Inicializar;

  try
    APedido := APedidosProveedorController.Nuevo;
    CopiarContratoAPedido(AContrato, APedido);
    if ACopiarDetalles then
       CopiarDetallesAPedido(AContrato, APedido, AContrato.Detalles);

    APedidosProveedorController.Ver(APedido);
    Result := True;

  finally
    if Assigned(AContratosClienteController) then
       Finalizar;
  end;
end;

end.
