unit uGenerarFacturasProvPedProvUtils;

interface

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

type
  TdmGenerarFacturasProv = class(TDataModule)
    JsListaFacturasGeneradas: TJSDialog;
  end;

  function GenerarFacturaProv(const IDPedido : Integer) : Boolean; overload;
  function GenerarFacturaProv(APedidos : IBizPedidoProveedor) : Boolean; overload;
  function GenerarFacturaProv : Boolean; overload;

implementation

{$R *.dfm}

uses
  uDialogUtils,
  uBizDetallesPedidoProveedor,
  uPedidosProveedorController, uDetallesPedidoProveedorController,
  uFacturasProveedorController, uBizFacturasProveedor, uBizDetallesFacturaProveedor;

//  ,
//  , uProveedoresController,
//  , uControllerDetallesBase,


//  , uBizContactos, schPedidosClienteClient_Intf,
//  schPedidosProveedorClient_Intf;

var
  dmGenerarFacturasProv: TdmGenerarFacturasProv;
  APedidosProveedorController : IPedidosProveedorController;
  ADetallesPedidosProveedorController : IDetallesPedidoProveedorController;
  AFacturasProveedorController : IFacturasProveedorController;
//  AProveedoresController : IProveedoresController;

{ Métodos auxiliares }
{procedure CopiarPedidoAPedido(APedido: IBizPedidoCliente;
  APedido : IBizFacturaProveedor);
begin
  if not Assigned(APedido) then
    raise Exception.Create ('Albarán no asignado (CopiarPedidoAPedido)');

  if not Assigned(APedido) then
    raise Exception.Create ('Pedido no asignado (CopiarPedidoAPedido)');

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

  // El albarán tiene que venir ya abierto y posicionado donde hay que copiar
  APedido.ID_CLIENTE := APedido.ID_CLIENTE;
  APedido.ID_PEDIDO := APedido.ID;
  APedido.CALLE := APedido.CALLE;
  APedido.CODIGO_POSTAL := APedido.CODIGO_POSTAL;
  APedido.POBLACION := APedido.POBLACION;
  APedido.PROVINCIA := APedido.PROVINCIA;
  APedido.PERSONA_CONTACTO := APedido.PERSONA_CONTACTO;
  APedido.TELEFONO := APedido.TELEFONO;
  APedido.IMPORTE_NETO := APedido.IMPORTE_NETO;
  APedido.IMPORTE_PORTE := APedido.IMPORTE_PORTE;
  APedido.DESCUENTO := APedido.DESCUENTO;
  APedido.IMPORTE_DESCUENTO := APedido.IMPORTE_DESCUENTO;
  APedido.BASE_IMPONIBLE := APedido.BASE_IMPONIBLE;
  APedido.IVA := APedido.IVA;
  APedido.IMPORTE_IVA := APedido.IMPORTE_IVA;
  APedido.IMPORTE_TOTAL := APedido.IMPORTE_TOTAL;
  APedido.DataTable.FieldByName(fld_PedidosClienteOBSERVACIONES).AsVariant := APedido.DataTable.FieldByName(fld_PedidosClienteOBSERVACIONES).AsVariant;
  APedido.ID_FORMA_PAGO := APedido.ID_FORMA_PAGO;
end;

procedure CopiarArticulosPendAPedido(
  APedido: IBizPedidoCliente;
  APedido: IBizFacturaProveedor;
  AArticulosPendientes: IBizPedidoClienteArticulosPend);
var
  i : integer;
  ADetalles : IBizDetallesFacturaProveedor;
  ADetallesController : IDetallesFacturaProveedorController;
begin
  if not Assigned(APedido) then
    raise Exception.Create ('Albarán no asignado (CopiarArticulosPendAPedido)');

  if not Assigned(APedido) then
    raise Exception.Create ('Pedido no asignado (CopiarArticulosPendAPedido)');

  if not Assigned(AArticulosPendientes) then
    raise Exception.Create ('Artículos pendientes no asignado (CopiarArticulosPendAPedido)');

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

  // El albarán tiene que venir ya abierto y posicionado donde hay que copiar

  ADetalles := APedido.Detalles;
  ADetallesController := TDetallesFacturaProveedorController.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);

    AArticulosPendientes.DataTable.First;
    for i := 0 to AArticulosPendientes.DataTable.RecordCount - 1 do
    begin
      APedido.Detalles.First;
      if (APedido.Detalles.Locate('ID_ARTICULO', AArticulosPendientes.ID_ARTICULO, [])) then
        if (AArticulosPendientes.CANTIDAD_PENDIENTE > 0) then
        begin
          ADetallesController.Add(ADetalles, TIPO_DETALLE_CONCEPTO);
          ADetalles.Edit;
          ADetalles.REFERENCIA := APedido.Detalles.REFERENCIA;
          ADetalles.ID_ARTICULO := APedido.Detalles.ID_ARTICULO;
          ADetalles.CONCEPTO := APedido.Detalles.CONCEPTO;
          ADetalles.CANTIDAD := AArticulosPendientes.CANTIDAD_PENDIENTE;
          ADetalles.IMPORTE_UNIDAD := APedido.Detalles.IMPORTE_UNIDAD;
          ADetalles.IMPORTE_TOTAL := APedido.Detalles.IMPORTE_TOTAL;
          ADetalles.DESCUENTO := APedido.Detalles.DESCUENTO;
          ADetalles.IMPORTE_PORTE := APedido.Detalles.IMPORTE_PORTE;
          ADetalles.VISIBLE := APedido.Detalles.VISIBLE;
          ADetalles.REFERENCIA_PROVEEDOR := APedido.Detalles.REFERENCIA_PROVEEDOR;
          ADetalles.Post;
          AArticulosPendientes.Next;
        end;
    end;
  finally
    ADetallesController.EndUpdate(ADetalles);
    ADetallesController := NIL;
  end;
end;  }

procedure Inicializar;
begin
  dmGenerarFacturasProv := TdmGenerarFacturasProv.Create(nil);
  APedidosProveedorController := TPedidosProveedorController.Create;
  ADetallesPedidosProveedorController := TDetallesPedidoProveedorController.Create;
  AFacturasProveedorController := TFacturasProveedorController.Create;
//  AProveedoresController := TProveedoresController.Create;
end;

procedure Finalizar;
begin
  FreeAndNIL(dmGenerarFacturasProv);
  APedidosProveedorController := nil;
  ADetallesPedidosProveedorController := nil;
  AFacturasProveedorController := nil;
//  AProveedoresController := nil;
end;


function GenerarFacturaProv(const IDPedido : Integer) : Boolean; overload;
var
  APedido : IBizPedidoProveedor;
begin
  Result := False;
  if not Assigned(APedidosProveedorController) then
     Inicializar;

  APedido := APedidosProveedorController.Buscar(IDPedido);
  Result := GenerarFacturaProv(APedido);

  if Assigned(APedidosProveedorController) then
     Finalizar;
end;

function GenerarFacturaProv(APedidos : IBizPedidoProveedor) : Boolean; overload;
var
  ARespuesta : Integer;
  AFacturasNuevas : IBizFacturaProveedor;
//  AArticulos: IBizPedidoClienteArticulosPend;
  i: Integer;
begin
  Result := False;
  if not Assigned(APedidosProveedorController) then
     Inicializar;

  if not Assigned(APedidos) then
     raise Exception.Create('Albarán de proveedor no asignado (GenerarFacturaProv)');

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

  try
     AFacturasNuevas := AFacturasProveedorController.Nuevo(False);
     if AFacturasProveedorController.Anadir(AFacturasNuevas, APedidos.ID) then
     begin
       if AFacturasNuevas.DataTable.RecordCount = 1 then
          AFacturasProveedorController.Ver(AFacturasNuevas)
       else begin
          with dmGenerarFacturasProv.JsListaFacturasGeneradas.Content do
          begin
            Clear;
            AFacturasNuevas.DataTable.Last;
            for i := 0 to AFacturasNuevas.DataTable.RecordCount - 1 do
            begin
              if Length(AFacturasNuevas.REFERENCIA) > 0 then
                  Add(AFacturasNuevas.REFERENCIA + ': ' + AFacturasNuevas.NOMBRE);
              AFacturasNuevas.DataTable.Prior;
            end;
          end;
          dmGenerarFacturasProv.JsListaFacturasGeneradas.Execute;
        end;
//          actRefrescar.Execute;
      end;
   finally
     AFacturasNuevas := NIL;
   end;
end;

function GenerarFacturaProv : Boolean; overload;
var
  APedidos : IBizPedidoProveedor;
begin
{
  Result := False;
  if not Assigned(APedidosProveedorController) then
     Inicializar;

  APedidos := APedidosProveedorController.ElegirPedidos(APedidosProveedorController.BuscarSinFacturar,
                'Elija el albarán o Pedidos de proveedor que desea utilizar para dar de alta la factura.'
                + #10#13 + 'Si elige Pedidos de proveedores diferentes se dará de alta una factura por cada uno de ellos.' , True);

  Result := GenerarFacturaProv(APedidos);

  if Assigned(APedidosProveedorController) then
     Finalizar;
}     
end;

end.
