unit uBizMontajesDetalles;

interface

uses
  uDAInterfaces, uDADataTable, schMontajesClient_Intf,
  uBizContactos,
  uBizMontajes, uBizPresupuestos, Classes, uDBSelectionListUtils;

const
  BIZ_CLIENT_MONTAJE_DETALLES = 'Client.Montaje.Detalles';
  BIZ_CLIENT_DETALLES_MONTAJE = 'Client.DetallesMontaje';

type
  IBizDetallesMontaje = interface(IMontajes_Detalles)
  ['{053FA316-8E38-470F-ABBE-B9534112D0D6}']
    function EsNuevo: Boolean;
  end;

  IBizMontajeDetalles = interface(IBizMontaje)
  ['{0E5E7B4C-3FBF-45BF-B5F7-170DB6A906C5}']
    function GetDetalles: IBizDetallesMontaje;
    procedure SetDetalles(Value: IBizDetallesMontaje);
    property Detalles: IBizDetallesMontaje read GetDetalles write SetDetalles;

    procedure SetPresupuesto(AValue : IBizPresupuesto);
    function GetPresupuesto : IBizPresupuesto;
    property Presupuesto : IBizPresupuesto read GetPresupuesto write SetPresupuesto;
  end;

  //Clase de negocio de los detalles del montaje
  TBizDetallesMontaje = class(TMontajes_DetallesDataTableRules, IBizDetallesMontaje)
  private
    FContadorID: Integer;
  protected
    procedure OnNewRecord(Sender: TDADataTable); override;
  public
    function EsNuevo: Boolean;
    constructor Create(aDataTable: TDADataTable); override;
  end;

  //Clase de negocio de montajes a los que le añadimos detalles
  TBizMontajeDetalles = class(TBizMontaje, IBizMontajeDetalles)
  protected
    FPresupuesto : IBizPresupuesto;
    FDetalles : IBizDetallesMontaje;
    FDetallesLink : TDADataSource;
    function GetDetalles: IBizDetallesMontaje;
    procedure SetDetalles(Value: IBizDetallesMontaje);
    procedure SetPresupuesto(AValue : IBizPresupuesto);
    function GetPresupuesto : IBizPresupuesto;

  public
    property Presupuesto : IBizPresupuesto read GetPresupuesto write SetPresupuesto;
    property Detalles: IBizDetallesMontaje read GetDetalles write SetDetalles;
    constructor Create(aDataTable: TDADataTable); override;
    destructor Destroy; override;
  end;

implementation

uses
  SysUtils, uDataTableUtils, DB, uDateUtils, DateUtils, uDataModuleUsuarios,
  Variants, cxDateUtils, Forms, Windows;

{ TBizMontajeDetalles }

constructor TBizMontajeDetalles.Create(aDataTable: TDADataTable);
begin
  inherited;
  FPresupuesto := Nil;
  FDetallesLink := TDADataSource.Create(NIL);
  FDetallesLink.DataTable := aDataTable;
end;

destructor TBizMontajeDetalles.Destroy;
begin
  FPresupuesto := Nil;
  FDetalles := NIL;
  FDetallesLink.Free;
  inherited;
end;

function TBizMontajeDetalles.GetDetalles: IBizDetallesMontaje;
begin
  Result := FDetalles;
end;

function TBizMontajeDetalles.GetPresupuesto: IBizPresupuesto;
begin
  Result := FPresupuesto;
end;

procedure TBizMontajeDetalles.SetDetalles(Value: IBizDetallesMontaje);
begin
  FDetalles := Value;
  EnlazarMaestroDetalle(FDetallesLink, FDetalles);
end;

procedure TBizMontajeDetalles.SetPresupuesto(AValue: IBizPresupuesto);
begin
  FPresupuesto := AValue;

  if Assigned(FPresupuesto) then
  begin
    if not FPresupuesto.DataTable.Active then
      FPresupuesto.DataTable.Active := True;

    if ID_PRESUPUESTO <> FPresupuesto.ID then
    begin
      DataTable.Edit;
      ID_PRESUPUESTO := FPresupuesto.ID;
      REFERENCIA := FPresupuesto.REFERENCIA;

      if (Application.MessageBox('¿Desea asignar los conceptos del presupuesto a los del montaje?', 'Atención', MB_YESNO) = IDYES) then
      begin
        IMPORTE_TOTAL := FPresupuesto.IMPORTE_TOTAL;

        if Assigned(FPresupuesto.Detalles) then
        begin
          //Copiamos los detalles del presupuesto
          with FPresupuesto.Detalles do
          begin
            //Borramos los que tuviera antes
            Detalles.DataTable.ClearRows;
            
            DataTable.First;
            while not DataTable.EOF do
            begin
              Detalles.Insert;
              Detalles.POSICION := POSICION;
              Detalles.TIPO_DETALLE := TIPO_DETALLE;
              Detalles.CONCEPTO := CONCEPTO;
              Detalles.CANTIDAD := CANTIDAD;
              Detalles.DESCUENTO := DESCUENTO;
              Detalles.IMPORTE_UNIDAD := IMPORTE_UNIDAD;
              Detalles.IMPORTE_TOTAL := IMPORTE_TOTAL;
              Detalles.Post;
              DataTable.Next;
            end;
          end;
        end;
      end;
    end;
  end;
end;

{ TBizDetallesMontaje }

constructor TBizDetallesMontaje.Create(aDataTable: TDADataTable);
begin
  inherited Create(aDataTable);
  FContadorID := -1;
end;

function TBizDetallesMontaje.EsNuevo: Boolean;
begin
  Result := (ID < 0);
end;

procedure TBizDetallesMontaje.OnNewRecord(Sender: TDADataTable);
begin
  inherited;
  ID := FContadorID; // -1, -2, -3...
  Dec(FContadorID);
end;

initialization
  RegisterDataTableRules(BIZ_CLIENT_MONTAJE_DETALLES, TBizMontajeDetalles);
  RegisterDataTableRules(BIZ_CLIENT_DETALLES_MONTAJE, TBizDetallesMontaje);

finalization

end.

