unit uGenerarFacturasCliAlbCliUtils;

interface

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

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

  function GenerarFacturaCli(const IDAlbaran : Integer) : Boolean; overload;
  function GenerarFacturaCli(AAlbaran : IBizAlbaranCliente) : Boolean; overload;
  function GenerarFacturaCli : Boolean; overload;

implementation

{$R *.dfm}

uses
  uDialogUtils,
  uBizFacturasCliente,
  uBizDetallesFacturaCliente,
  uAlbaranesClienteController, uDetallesFacturaClienteController,
  uFacturasClienteController;

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


//  , uBizContactos, schPedidosClienteClient_Intf,
//  schAlbaranesClienteClient_Intf;

var
  dmGenerarFacturasCli: TdmGenerarFacturasCli;
  AFacturasClienteController : IFacturasClienteController;
  AAlbaranesClienteController : IAlbaranesClienteController;
  ADetallesAlbaranesClienteController : IDetallesFacturaClienteController;
//  AProveedoresController : IProveedoresController;

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

  if not Assigned(AAlbaran) then
    raise Exception.Create ('Pedido no asignado (CopiarPedidoAAlbaran)');

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

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

procedure CopiarArticulosPendAAlbaran(
  AAlbaran: IBizPedidoCliente;
  AAlbaran: IBizAlbaranProveedor;
  AArticulosPendientes: IBizPedidoClienteArticulosPend);
var
  i : integer;
  ADetalles : IBizDetallesFacturaClieedor;
  ADetallesController : IDetallesFacturaClieedorController;
begin
  if not Assigned(AAlbaran) then
    raise Exception.Create ('Albarán no asignado (CopiarArticulosPendAAlbaran)');

  if not Assigned(AAlbaran) then
    raise Exception.Create ('Pedido no asignado (CopiarArticulosPendAAlbaran)');

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

  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 := AAlbaran.Detalles;
  ADetallesController := TDetallesFacturaClieedorController.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
      AAlbaran.Detalles.First;
      if (AAlbaran.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 := AAlbaran.Detalles.REFERENCIA;
          ADetalles.ID_ARTICULO := AAlbaran.Detalles.ID_ARTICULO;
          ADetalles.CONCEPTO := AAlbaran.Detalles.CONCEPTO;
          ADetalles.CANTIDAD := AArticulosPendientes.CANTIDAD_PENDIENTE;
          ADetalles.IMPORTE_UNIDAD := AAlbaran.Detalles.IMPORTE_UNIDAD;
          ADetalles.IMPORTE_TOTAL := AAlbaran.Detalles.IMPORTE_TOTAL;
          ADetalles.DESCUENTO := AAlbaran.Detalles.DESCUENTO;
          ADetalles.IMPORTE_PORTE := AAlbaran.Detalles.IMPORTE_PORTE;
          ADetalles.VISIBLE := AAlbaran.Detalles.VISIBLE;
          ADetalles.REFERENCIA_PROVEEDOR := AAlbaran.Detalles.REFERENCIA_PROVEEDOR;
          ADetalles.Post;
          AArticulosPendientes.Next;
        end;
    end;
  finally
    ADetallesController.EndUpdate(ADetalles);
    ADetallesController := NIL;
  end;
end;  }

procedure Inicializar;
begin
  dmGenerarFacturasCli := TdmGenerarFacturasCli.Create(nil);
  AFacturasClienteController := TFacturasClienteController.Create;
  AAlbaranesClienteController := TAlbaranesClienteController.Create;
  ADetallesAlbaranesClienteController := TDetallesFacturaClienteController.Create;
//  AProveedoresController := TProveedoresController.Create;
end;

procedure Finalizar;
begin
  FreeAndNIL(dmGenerarFacturasCli);
  AFacturasClienteController := nil;
  AAlbaranesClienteController := nil;
  ADetallesAlbaranesClienteController := nil;
//  AProveedoresController := nil;
end;


function GenerarFacturaCli(const IDAlbaran : Integer) : Boolean; overload;
var
  AAlbaran : IBizAlbaranCliente;
begin
  Result := False;

  try

    if not Assigned(AAlbaranesClienteController) then
       Inicializar;

    AAlbaran := AAlbaranesClienteController.Buscar(IDAlbaran);

    if Assigned(AAlbaran) then
    Result := GenerarFacturaCli(AAlbaran);

    if Assigned(AAlbaranesClienteController) then
       Finalizar;

  finally
    AAlbaran := NIL;
  end;
end;

function GenerarFacturaCli(AAlbaran : IBizAlbaranCliente) : Boolean; overload;
var
  AFacturasNuevas : IBizFacturaCliente;
  i: Integer;
begin
  Result := False;

  if not Assigned(AAlbaranesClienteController) then
     Inicializar;

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

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

  try
     AFacturasNuevas := AFacturasClienteController.Nuevo(False);
     if AFacturasClienteController.Anadir(AFacturasNuevas, AAlbaran) then
     begin
       if AFacturasNuevas.DataTable.RecordCount = 1 then
       begin
          if AFacturasNuevas.TIPO = CTE_TIPO_FACTURA then
             ShowInfoMessage('La factura se ha dado de alta con el código ' + AFacturasNuevas.REFERENCIA)
          else
             ShowInfoMessage('El abono se ha dado de alta con el código ' + AFacturasNuevas.REFERENCIA);
       end
       else begin
          with dmGenerarFacturasCli.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;
          dmGenerarFacturasCli.JsListaFacturasGeneradas.Execute;
       end;
     end;

   if Assigned(AAlbaranesClienteController) then
      Finalizar;

   finally
     AFacturasNuevas := NIL;
   end;
end;

function GenerarFacturaCli : Boolean; overload;
var
  AAlbaranes : IBizAlbaranCliente;
begin
  Result := False;
  try
    if not Assigned(AAlbaranesClienteController) then
       Inicializar;

    AAlbaranes := AAlbaranesClienteController.ElegirAlbaranes(AAlbaranesClienteController.BuscarSinFacturar,
                  'Elija el albarán o albaranes de cliente que desea utilizar para dar de alta la factura.'
                  + #10#13 + 'Si elige albaranes de clientes diferentes se dará de alta una factura por cada uno de ellos.' , True);

    if Assigned(AAlbaranes) then
       Result := GenerarFacturaCli(AAlbaranes);

    if Assigned(AAlbaranesClienteController) then
       Finalizar;
  finally
    AAlbaranes := Nil;
  end;
end;

end.
