unit uGenerarContratosCliUtils;

interface

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

type
  TdmGenerarContratosCli = class(TDataModule)
    JsListaContratosGenerados: TJSDialog;
  end;

  function GenerarContratoCli(const IDPresupuesto : Integer; const APreguntaMostrarContrato : Boolean = True) : Boolean; overload;
  function GenerarContratoCli(APresupuesto : IBizPresupuestoCliente; var AContrato: IBizContratoCliente;
    const APreguntaMostrarContrato : Boolean = True) : Boolean; overload;
//  function ElegirPedidoYGenerarAlbaranCli(var IDAlbaran: Integer) : Boolean;

implementation

{$R *.dfm}

uses
  uDialogUtils, uBizDetallesPresupuestoCliente, uBizDetallesContratoCliente,
  uPresupuestosClienteController, uContratosClienteController, uClientesController,
  uDetallesContratoClienteController, uControllerDetallesBase,
  uBizContactos, schPresupuestosClienteClient_Intf,
  schContratosClienteClient_Intf, uDireccionesContactoController,
  uBizDireccionesContacto, uFactuGES_App, uConfiguracionController;

var
  dmGenerarContratosCli: TdmGenerarContratosCli;
  APresupuestosClienteController : IPresupuestosClienteController;
  AContratosClienteController : IContratosClienteController;
  ADireccionesController : IDireccionesContactoController;
  AClientesController : IClientesController;

{ Métodos auxiliares }
procedure PreguntarMostrarContrato(AContrato : IBizContratoCliente);
var
  ARespuesta : Integer;
begin
  if not Assigned(AContrato) then
    raise Exception.Create ('Contrato no asignado (PreguntaSiMostrarContrato)');

  with dmGenerarContratosCli.JsListaContratosGenerados do
  begin
    Instruction.Text := 'Se ha generado el contrato';

    Content.Clear;
    Content.Add(Format('Se ha generado correctamente el contrato %s a partir del presupuesto de cliente' + #10#13,
      [AContrato.REFERENCIA]));
    Execute;

    ARespuesta := CustomButtonResult;
    case ARespuesta of
      100 : begin
              // Ver el albarán
              AContratosClienteController.Ver(AContrato);
            end;
      200 : // Continuar;
    end;
  end;
end;


procedure CopiarPresupuestoAContrato(APresupuesto: IBizPresupuestoCliente;
  AContrato : IBizContratoCliente);
var
  FDireccion: IBizDireccionesContacto;

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

  if not Assigned(APresupuesto) then
    raise Exception.Create ('Presupuesto no asignado (CopiarPresupuestoAContrato)');

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

  // El contrato tiene que venir ya abierto y posicionado donde hay que copiar
  AContrato.ID_CLIENTE := APresupuesto.ID_CLIENTE;
  AContrato.NIF_CIF := APresupuesto.NIF_CIF;
  AContrato.NOMBRE := APresupuesto.NOMBRE;

  APresupuestosClienteController.RecuperarCliente(APresupuesto);
  APresupuesto.Cliente.Open;
  FDireccion := ADireccionesController.Nuevo;
  try
    if (not APresupuesto.ID_DIRECCIONIsNull) and
       (ADireccionesController.Localizar(APresupuesto.Cliente.Direcciones, APresupuesto.ID_DIRECCION)) then
        ADireccionesController.CopiarDireccion(APresupuesto.Cliente.Direcciones, FDireccion)
    else
        ADireccionesController.CopiarDireccionFiscal(APresupuesto.Cliente, FDireccion);

    AContrato.CALLE := FDireccion.CALLE;
    AContrato.POBLACION := FDireccion.POBLACION;
    AContrato.PROVINCIA := FDireccion.PROVINCIA;
    AContrato.CODIGO_POSTAL := FDireccion.CODIGO_POSTAL;
  finally
    FDireccion := NIL;
  end;

  AContrato.TELEFONO := APresupuesto.Cliente.TELEFONO_1;
  AContrato.MOVIL := APresupuesto.Cliente.MOVIL_1;

  AContrato.PERSONA_CONTACTO := APresupuesto.PERSONA_CONTACTO;
  AContrato.DataTable.FieldByName(fld_ContratosClienteFORMA_PAGO).AsVariant := APresupuesto.DataTable.FieldByName(fld_PresupuestosClienteFORMA_PAGO).AsVariant;  
  AContrato.DataTable.FieldByName(fld_ContratosClientePLAZO_ENTREGA).AsVariant := APresupuesto.DataTable.FieldByName(fld_PresupuestosClientePLAZO_ENTREGA).AsVariant;
  AContrato.DataTable.FieldByName(fld_ContratosClienteOBSERVACIONES).AsVariant := APresupuesto.DataTable.FieldByName(fld_PresupuestosClienteOBSERVACIONES).AsVariant;
  AContrato.DataTable.FieldByName(fld_ContratosClienteCALIDADES).AsVariant := Trim(APresupuesto.DataTable.FieldByName(fld_PresupuestosClienteCALIDADES).AsVariant);
  AContrato.IMPORTE_NETO := APresupuesto.IMPORTE_NETO;
  AContrato.IMPORTE_PORTE := APresupuesto.IMPORTE_PORTE;
  AContrato.DESCUENTO := APresupuesto.DESCUENTO;
  AContrato.IMPORTE_DESCUENTO := APresupuesto.IMPORTE_DESCUENTO;
  AContrato.BASE_IMPONIBLE := APresupuesto.BASE_IMPONIBLE;
  AContrato.ID_TIPO_IVA := APresupuesto.ID_TIPO_IVA;
  AContrato.IVA := APresupuesto.IVA;
  AContrato.IMPORTE_IVA := APresupuesto.IMPORTE_IVA;
  AContrato.IMPORTE_TOTAL := APresupuesto.IMPORTE_TOTAL;
//  AContrato.ID_TIENDA := APresupuesto.ID_TIENDA;
//  AContrato.ID_VENDEDOR := APresupuesto.ID_VENDEDOR;
  AContrato.RECARGO_EQUIVALENCIA := APresupuesto.RECARGO_EQUIVALENCIA;
  AContrato.RE := APresupuesto.RE;
  AContrato.IMPORTE_RE := APresupuesto.IMPORTE_RE;
  AContrato.TIPO_CONTRATO := APresupuesto.TIPO_PRESUPUESTO;
  AContrato.REFERENCIA_CLIENTE := APresupuesto.REFERENCIA_CLIENTE;
end;

procedure CopiarDetallesAContrato(
  APresupuesto: IBizPresupuestoCliente;
  AContrato: IBizContratoCliente;
  AArticulos: IBizDetallesPresupuestoCliente);
var
  i : integer;
  ADetalles : IBizDetallesContratoCliente;
  ADetallesController : IDetallesContratoClienteController;
begin
  if not Assigned(AContrato) then
    raise Exception.Create ('Contrato no asignado (CopiarDetallesAContrato)');

  if not Assigned(APresupuesto) then
    raise Exception.Create ('Presupuesto no asignado (CopiarDetallesAContrato)');

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

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

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

  ADetalles := AContrato.Detalles;
  ADetallesController := TDetallesContratoClienteController.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
      //En el caso de tener algún capitulo de cocina vacio (cocina de presupuestos)
      //se añade un capitulo de cocina con sus propiedades para el contrato 
      if ((AArticulos.TIPO_DETALLE = TIPO_DETALLE_TITULO)
      and (AArticulos.TIPO_ARTICULO = TIPO_CAPITULO_C_VACIO)) then
          ADetallesController.AnadirCapitulo(TIPO_CAPITULO_C,'MUEBLES DE COCINA ', False, ADetalles);

      //En contratos ya no existirá ningún capitulo opcional todos sumarán
      if (AArticulos.TIPO_DETALLE = TIPO_DETALLE_TITULO_OPCIONAL) then
        ADetallesController.Add(ADetalles, TIPO_DETALLE_TITULO)
      else
        ADetallesController.Add(ADetalles, AArticulos.TIPO_DETALLE);
      ADetalles.Edit;
      ADetalles.REFERENCIA := AArticulos.REFERENCIA;
      ADetalles.ID_ARTICULO := AArticulos.ID_ARTICULO;
      ADetalles.TIPO_ARTICULO := AArticulos.TIPO_ARTICULO;
      ADetalles.PROPIEDAD := AArticulos.PROPIEDAD;
      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;
      AArticulos.Next;
    end;
  finally
    ADetallesController.EndUpdate(ADetalles);
    ADetallesController := NIL;
  end;
end;

procedure Inicializar;
begin
  dmGenerarContratosCli := TdmGenerarContratosCli.Create(nil);
  APresupuestosClienteController := TPresupuestosClienteController.Create;
  AContratosClienteController := TContratosClienteController.Create;
  AClientesController := TClientesController.Create;
  ADireccionesController := TDireccionesContactoController.Create;
end;

procedure Finalizar;
begin
  FreeAndNIL(dmGenerarContratosCli);
  APresupuestosClienteController := nil;
  AContratosClienteController := nil;
  AClientesController := nil;
  ADireccionesController := nil;  
end;


function GenerarContratoCli(const IDPresupuesto : Integer; const APreguntaMostrarContrato : Boolean = True) : Boolean; overload;
var
  APresupuesto : IBizPresupuestoCliente;
  AContrato : IBizContratoCliente;
begin
  Result := False;

  try
    if not Assigned(APresupuestosClienteController) then
       Inicializar;

    APresupuesto := APresupuestosClienteController.Buscar(IDPresupuesto);
    if Assigned(APresupuesto) then
       Result := GenerarContratoCli(APresupuesto, AContrato);
  finally
    if Assigned(APresupuestosClienteController) then
       Finalizar;
  end;
end;

function GenerarContratoCli(APresupuesto : IBizPresupuestoCliente; var AContrato: IBizContratoCliente; const APreguntaMostrarContrato : Boolean = True) : Boolean; overload;
begin
  AContrato := NIL;

  if not Assigned(APresupuesto) then
    raise Exception.Create('Presupuesto de cliente no asignado (GenerarContratoCli)');

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

  if not Assigned(APresupuestosClienteController) then
     Inicializar;

  try
    AContrato := AContratosClienteController.Nuevo;
    CopiarPresupuestoAContrato(APresupuesto, AContrato);
    if (APresupuesto.TIPO_PRESUPUESTO = CTE_COCINA) then
       AContrato.CONDICIONES.Text := AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_CONDICIONES_COCINA)
    else if (APresupuesto.TIPO_PRESUPUESTO = CTE_ARMARIO) then
       AContrato.CONDICIONES.Text := AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_CONDICIONES_ARMARIO)
    else if (APresupuesto.TIPO_PRESUPUESTO = CTE_BANO) then
       AContrato.CONDICIONES.Text := AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_CONDICIONES_BANO)
    else if (APresupuesto.TIPO_PRESUPUESTO = CTE_ELECTRODOMESTICO) then
       AContrato.CONDICIONES.Text := AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_CONDICIONES_ELECTRODOMESTICO)
    else if (APresupuesto.TIPO_PRESUPUESTO = CTE_OBRA) then
       AContrato.CONDICIONES.Text := AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_CONDICIONES_OBRA)
    else if (APresupuesto.TIPO_PRESUPUESTO = CTE_VARIOS) then
       AContrato.CONDICIONES.Text := AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_CONDICIONES_VARIOS);

    CopiarDetallesAContrato(APresupuesto, AContrato, APresupuesto.Detalles);

    //Sustituir por if de guardar
    if AContratosClienteController.Guardar(AContrato) then
    begin
      // Asocio el contrato al presupuesto
      APresupuesto.Edit;
      APresupuesto.ID_CONTRATO := AContrato.ID;
      APresupuesto.Post;
      APresupuestosClienteController.Guardar(APresupuesto);

      if APreguntaMostrarContrato then
        PreguntarMostrarContrato(AContrato);

    end;

    Result := True;
  finally
    if Assigned(APresupuestosClienteController) then
       Finalizar;
  end;
end;
{
function ElegirPedidoYGenerarAlbaranCli(var IDAlbaran: Integer) : Boolean; overload;
var
  APedido : IBizPedidoCliente;
  AAlbaran : IBizAlbaranCliente;
begin
  Result := False;
  IDAlbaran := -1;

  AAlbaran := NIL;
  try
    if not Assigned(APedidosClienteController) then
      Inicializar;

    APedido := APedidosClienteController.ElegirPedidos(APedidosClienteController.BuscarPendientes,
                  'Elija el pedido de cliente que desea utilizar para dar de alta el albarán de cliente.'
                  , False);

    if Assigned(APedido) then
    begin
      Result := GenerarAlbaranCli(APedido, AAlbaran);
      if Result then
        IDAlbaran := AAlbaran.ID;
    end;
  finally
    if Assigned(APedidosClienteController) then
      Finalizar;
  end;
end;
}
end.
