unit uBizAlbaranesProveedor;

interface

uses
  Classes, uDADataTable, uDAInterfaces,
  schAlbaranesProveedorClient_Intf, uDBSelectionListUtils,
  uBizContactos, uBizDetallesAlbaranProveedor;

const
  BIZ_CLIENT_ALBARAN_PROVEEDOR = 'Client.AlbaranProveedor';

  CTE_TIPO_ALBARAN = 'A';
  CTE_TIPO_ALBARAN_DEV = 'D';

type
  IBizAlbaranProveedor = interface(IAlbaranesProveedor)
  ['{8042AD9C-08B1-4236-B0EA-F11C4942DFE4}']

    procedure SetProveedor(AValue : IBizProveedor);
    function GetProveedor : IBizProveedor;
    property Proveedor : IBizProveedor read GetProveedor write SetProveedor;

    // Esta propidad es para que el controlador pueda acceder directamente
    // a la propiedad Proveedor
    procedure _SetProveedor(AValue : IBizProveedor);
    function _GetProveedor : IBizProveedor;
    property _Proveedor : IBizProveedor read _GetProveedor write _SetProveedor;

    function GetDetalles: IBizDetallesAlbaranProveedor;
    procedure SetDetalles(Value: IBizDetallesAlbaranProveedor);
    property Detalles: IBizDetallesAlbaranProveedor read GetDetalles write SetDetalles;

    function EsNuevo : Boolean;
  end;

  TBizAlbaranProveedor = class(TAlbaranesProveedorDataTableRules, IBizAlbaranProveedor, ISeleccionable)
  private
    procedure CalcularBaseImponible;
    procedure CalcularIVA;
  protected
    FSeleccionableInterface : ISeleccionable;
    FProveedor : IBizProveedor;
    FDetalles : IBizDetallesAlbaranProveedor;
    FDetallesLink : TDADataSource;

    procedure SetProveedor(AValue : IBizProveedor);
    function GetProveedor : IBizProveedor;

    procedure _SetProveedor(AValue : IBizProveedor);
    function _GetProveedor : IBizProveedor;

    function GetDetalles: IBizDetallesAlbaranProveedor;
    procedure SetDetalles(Value: IBizDetallesAlbaranProveedor);

    procedure SetFECHA_ALBARANValue(const aValue: TDateTime); override;
    procedure SetID_PEDIDOValue(const aValue: Integer); override;
    procedure SetID_ALMACENValue(const aValue: Integer); override;
    procedure SetID_FACTURAValue(const aValue: Integer); override;
    procedure SetID_FORMA_PAGOValue(const aValue: Integer); override;
		procedure SetID_TIENDAValue(const aValue: Integer); 

    procedure IMPORTE_NETOOnChange(Sender: TDACustomField);
    procedure IMPORTE_PORTEOnChange(Sender: TDACustomField);
    procedure DESCUENTOOnChange(Sender: TDACustomField);
    procedure IVAOnChange(Sender: TDACustomField);

    procedure OnNewRecord(Sender: TDADataTable); override;
    procedure IniciarValoresAlbaranNuevo;

  public
    procedure CalcularImporteTotal;
    function EsNuevo : Boolean;
    property Proveedor : IBizProveedor read GetProveedor write SetProveedor;
    property _Proveedor : IBizProveedor read _GetProveedor write _SetProveedor;

    property Detalles: IBizDetallesAlbaranProveedor read GetDetalles write SetDetalles;

    property SeleccionableInterface : ISeleccionable read FSeleccionableInterface
    write FSeleccionableInterface implements ISeleccionable;

    constructor Create(aDataTable: TDADataTable); override;
    destructor Destroy; override;
  end;

implementation

uses
  SysUtils, Variants, uDataModuleConfiguracion, uDataModuleUsuarios,
  uDataTableUtils, DateUtils, uDateUtils, DB, uFactuGES_App, uBizEmpresasTiendas;

{ TBizAlbaranProveedor }

procedure TBizAlbaranProveedor.CalcularBaseImponible;
begin
  if not Self.DataTable.Editing then
    Edit;
  IMPORTE_DESCUENTO := IMPORTE_NETO * (DESCUENTO/100);
  BASE_IMPONIBLE := IMPORTE_NETO - IMPORTE_DESCUENTO; //+ IMPORTE_PORTE; ya no se tiene en cuenta porque se desglosa por artículo
end;

procedure TBizAlbaranProveedor.CalcularImporteTotal;
begin
  DataTable.DisableControls;
  DataTable.Fields.FieldEventsDisabled := True;
  try
    CalcularBaseImponible;
    CalcularIVA;

    if not Self.DataTable.Editing then
      Edit;
    IMPORTE_TOTAL := BASE_IMPONIBLE + IMPORTE_IVA;
  finally
    DataTable.Fields.FieldEventsDisabled := False;
    DataTable.EnableControls;
  end;
end;

procedure TBizAlbaranProveedor.CalcularIVA;
begin
  if not Self.DataTable.Editing then
    Edit;
  IMPORTE_IVA := (IVA / 100) * (BASE_IMPONIBLE);
end;

constructor TBizAlbaranProveedor.Create(aDataTable: TDADataTable);
begin
  inherited;
  FProveedor := Nil;

  with DataTable do
  begin
    FieldByName(fld_AlbaranesProveedorIMPORTE_NETO).OnChange := IMPORTE_NETOOnChange;
    FieldByName(fld_AlbaranesProveedorIMPORTE_PORTE).OnChange := IMPORTE_PORTEOnChange;
    FieldByName(fld_AlbaranesProveedorDESCUENTO).OnChange := DESCUENTOOnChange;
    FieldByName(fld_AlbaranesProveedorIVA).OnChange := IVAOnChange;
  end;

  FDetallesLink := TDADataSource.Create(NIL);
  FDetallesLink.DataTable := aDataTable;
  
  FSeleccionableInterface := TSeleccionable.Create(aDataTable);
end;

procedure TBizAlbaranProveedor.DESCUENTOOnChange(Sender: TDACustomField);
begin
  CalcularImporteTotal;
end;

destructor TBizAlbaranProveedor.Destroy;
begin
  FProveedor := NIL;
  FDetalles := NIL;
  FDetallesLink.Free;
  
  FSeleccionableInterface := NIL;
  inherited;
end;

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

function TBizAlbaranProveedor.GetProveedor: IBizProveedor;
begin
  Result := FProveedor;
end;

procedure TBizAlbaranProveedor.IMPORTE_NETOOnChange(Sender: TDACustomField);
begin
  CalcularImporteTotal;
end;

procedure TBizAlbaranProveedor.IMPORTE_PORTEOnChange(Sender: TDACustomField);
begin
  CalcularImporteTotal;
end;

procedure TBizAlbaranProveedor.IniciarValoresAlbaranNuevo;
begin
  ID_EMPRESA := AppFactuGES.EmpresaActiva.ID;
  USUARIO := AppFactuGES.UsuarioActivo.UserName;
  FECHA_ALBARAN := DateOf(Date);
  INCIDENCIAS_ACTIVAS := 0;
  TIPO := CTE_TIPO_ALBARAN;
  ID_TIENDA := AppFactuGES.TiendaActiva.ID;
  TIENDA := AppFactuGES.TiendaActiva.NOMBRE;

  // OJOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
  //TEMPORAL ALMACÉN PUESTO A CAPÓN Y PROVISIONAL
  ID_ALMACEN := 1;

end;

procedure TBizAlbaranProveedor.IVAOnChange(Sender: TDACustomField);
begin
  CalcularImporteTotal;
end;

function TBizAlbaranProveedor.GetDetalles: IBizDetallesAlbaranProveedor;
begin
  Result := FDetalles;
end;

procedure TBizAlbaranProveedor.OnNewRecord(Sender: TDADataTable);
begin
  inherited;
  ID := GetRecNo; // -1, -2, -3...
  IniciarValoresAlbaranNuevo;
end;

procedure TBizAlbaranProveedor.SetProveedor(AValue: IBizProveedor);
var
  bEnEdicion : Boolean;

begin
  FProveedor := AValue;

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

    if ID_PROVEEDOR <> FProveedor.ID then
    begin
      bEnEdicion := (DataTable.State in dsEditModes);
      if not bEnEdicion then
         DataTable.Edit;

      ID_PROVEEDOR := FProveedor.ID;

      DataTable.Post;  //Muy importante ya que es necesario hacer un post de la cabecera antes de añadir detalles
                       //si se quita el id de la cabecera y los detalles se desincroniza
      if bEnEdicion then
         DataTable.Edit;
    end;
  end;
end;

function TBizAlbaranProveedor._GetProveedor: IBizProveedor;
begin
  Result := FProveedor;
end;

procedure TBizAlbaranProveedor._SetProveedor(AValue: IBizProveedor);
begin
  FProveedor := AValue;
end;

procedure TBizAlbaranProveedor.SetDetalles(Value: IBizDetallesAlbaranProveedor);
begin
  FDetalles := Value;
  EnlazarMaestroDetalle(FDetallesLink, FDetalles);
end;

procedure TBizAlbaranProveedor.SetFECHA_ALBARANValue(const aValue: TDateTime);
begin
  if EsFechaVacia(aValue) then
    SetFieldNull(DataTable, fld_AlbaranesProveedorFECHA_ALBARAN)
  else
    inherited;
end;

procedure TBizAlbaranProveedor.SetID_ALMACENValue(const aValue: Integer);
begin
  if (aValue = 0) then
    SetFieldNull(DataTable, fld_AlbaranesProveedorID_ALMACEN)
  else
    inherited;
end;

procedure TBizAlbaranProveedor.SetID_FACTURAValue(const aValue: Integer);
begin
  if (aValue = 0) then
    SetFieldNull(DataTable, fld_AlbaranesProveedorID_FACTURA)
  else
    inherited;
end;

procedure TBizAlbaranProveedor.SetID_TIENDAValue(const aValue: Integer); 
begin
	if aValue < 0 then
		DataTable.Fields[idx_AlbaranesProveedorID_TIENDA].AsVariant := NULL
	else
		inherited SetID_TIENDAValue(aValue);
end;

procedure TBizAlbaranProveedor.SetID_FORMA_PAGOValue(const aValue: Integer);
begin
  if (aValue = 0) then
    SetFieldNull(DataTable, fld_AlbaranesProveedorID_FORMA_PAGO)
  else
    inherited;
end;

procedure TBizAlbaranProveedor.SetID_PEDIDOValue(const aValue: Integer);
begin
  if (aValue = 0) then
    SetFieldNull(DataTable, fld_AlbaranesProveedorID_PEDIDO)
  else
    inherited;
end;

initialization
  RegisterDataTableRules(BIZ_CLIENT_ALBARAN_PROVEEDOR, TBizAlbaranProveedor);

finalization

end.

