unit uBizPedidosProveedor;

interface

uses
  Classes, uDADataTable, uDAInterfaces, uROClasses,
  schPedidosProveedorClient_Intf, uDBSelectionListUtils,
  uBizContactos, uBizDetallesPedidoProveedor;

const
  BIZ_CLIENT_PEDIDO_PROVEEDOR = 'Client.PedidoProveedor';

  SITUACION_PEDIDO_PENDIENTE = 'PENDIENTE';
  SITUACION_PEDIDO_PARCIAL = 'PARCIAL';
  SITUACION_PEDIDO_RECIBIDO = 'RECIBIDO';

type
  IBizPedidoProveedor = interface(IPedidosProveedor)
  ['{513FE06A-48B8-4FA6-8D1D-0DD48EAD9352}']

    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: IBizDetallesPedidoProveedor;
    procedure SetDetalles(Value: IBizDetallesPedidoProveedor);
    property Detalles: IBizDetallesPedidoProveedor read GetDetalles write SetDetalles;

    function EsNuevo : Boolean;
    function DarListaSituaciones: TStringList;
    procedure AsignarVendedor;
  end;

  TBizPedidoProveedor = class(TPedidosProveedorDataTableRules, IBizPedidoProveedor, ISeleccionable)
  private
    procedure CalcularBaseImponible;
    procedure CalcularIVA;

  protected
    FSeleccionableInterface : ISeleccionable;
    FProveedor : IBizProveedor;
    FDetalles : IBizDetallesPedidoProveedor;
    FDetallesLink : TDADataSource;

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

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

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

    procedure SetFECHA_ENVIOValue(const aValue: TDateTime); override;
    procedure SetFECHA_CONFIRMACIONValue(const aValue: TDateTime); override;
    procedure SetFECHA_ENTREGAValue(const aValue: TDateTime); override;
    procedure SetFECHA_PEDIDOValue(const aValue: TDateTime); override;
    procedure SetID_CONTRATO_CLIENTEValue(const aValue: Integer); override;
//    procedure SetINCIDENCIASValue(const aValue: IROStrings); override;
    procedure SetID_FORMA_PAGOValue(const aValue: Integer); override;
		procedure SetID_TIENDAValue(const aValue: Integer); override;
    procedure SetID_VENDEDORValue(const aValue: Integer); override;

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

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

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

    property Detalles: IBizDetallesPedidoProveedor 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, Dialogs, Variants, uDataModuleConfiguracion, uDataModuleUsuarios,
  uDataTableUtils, DateUtils, uDateUtils, DB, uFactuGES_App, uBizEmpresasTiendas,
  uVendedoresController;

{ TBizPedidoProveedor }

procedure TBizPedidoProveedor.RellenarContactoVendedor;
var
  AVendedoresController: IVendedoresController;
  AVendedor : IBizVendedor;
  ATelefonos : String;
begin
  ATelefonos := '';
  if ID_VENDEDORIsNull then begin
    SetFieldNull(DataTable, fld_PedidosProveedorPERSONA_CONTACTO);
    SetFieldNull(DataTable, fld_PedidosProveedorTELEFONO);
  end
  else begin
    AVendedoresController := TVendedoresController.Create;
    try
      AVendedor := (AVendedoresController.Buscar(ID_VENDEDOR) as IBizVendedor);
      if not Assigned(AVendedor) then
        raise Exception.Create (Format('No se ha encontrado un vendedor con ID %d (AsignarVendedor)', [ID_VENDEDOR]));

      AVendedor.DataTable.Active := True;
      PERSONA_CONTACTO := AVendedor.NOMBRE;

      if not AVendedor.TELEFONO_1IsNull then
        ATelefonos := ATelefonos + AVendedor.TELEFONO_1;

      if not AVendedor.MOVIL_1IsNull then
      begin
        if (Length(ATelefonos) > 0) then
          ATelefonos := ATelefonos + ' / ';
        ATelefonos := ATelefonos + AVendedor.MOVIL_1;
      end;

      TELEFONO := ATelefonos;
   finally
      AVendedor := nil;
      AVendedoresController := nil;
    end;
  end;
end;

procedure TBizPedidoProveedor.AsignarVendedor;
var
  AVendedoresController: IVendedoresController;
begin
  AVendedoresController := TVendedoresController.Create;
  try
    ID_VENDEDOR := AVendedoresController.DarIDVendedorDeUsuario(AppFactuGES.UsuarioActivo.ID);
    RellenarContactoVendedor;
  finally
    AVendedoresController := nil;
  end;
end;

procedure TBizPedidoProveedor.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 TBizPedidoProveedor.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 TBizPedidoProveedor.CalcularIVA;
begin
  if not Self.DataTable.Editing then
    Edit;
  IMPORTE_IVA := (IVA / 100) * (BASE_IMPONIBLE);
end;

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

  with DataTable do
  begin
    FieldByName(fld_PedidosProveedorIMPORTE_NETO).OnChange := IMPORTE_NETOOnChange;
    FieldByName(fld_PedidosProveedorIMPORTE_PORTE).OnChange := IMPORTE_PORTEOnChange;
    FieldByName(fld_PedidosProveedorDESCUENTO).OnChange := DESCUENTOOnChange;
    FieldByName(fld_PedidosProveedorIVA).OnChange := IVAOnChange;
    FieldByName(fld_PedidosProveedorID_VENDEDOR).OnChange := ID_VENDEDOROnChange;
  end;

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

  FSeleccionableInterface := TSeleccionable.Create(aDataTable);
end;

function TBizPedidoProveedor.DarListaSituaciones: TStringList;
begin
  Result := TStringList.Create;
  with Result do
  begin
    Add(SITUACION_PEDIDO_PENDIENTE);
    Add(SITUACION_PEDIDO_PARCIAL);
    Add(SITUACION_PEDIDO_RECIBIDO);
  end;
end;

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

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

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

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

procedure TBizPedidoProveedor.ID_VENDEDOROnChange(Sender: TDACustomField);
begin
  RellenarContactoVendedor;
end;

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

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

procedure TBizPedidoProveedor.IniciarValoresPedidoNuevo;
begin
  ID_EMPRESA := AppFactuGES.EmpresaActiva.ID;
  USUARIO := AppFactuGES.UsuarioActivo.UserName;
  FECHA_PEDIDO := DateOf(Date);
  SITUACION := SITUACION_PEDIDO_PENDIENTE;
  INCIDENCIAS_ACTIVAS := 0;
//  ID_PEDIDO_CLIENTE := 0;
  REF_CON_CLIENTE := '';

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

  ID_TIENDA := AppFactuGES.TiendaActiva.ID;
  TIENDA := AppFactuGES.TiendaActiva.NOMBRE;
  AsignarVendedor;
end;

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

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


procedure TBizPedidoProveedor.SetID_VENDEDORValue(const aValue: Integer);
begin
  if (aValue = 0) then
    SetFieldNull(DataTable, fld_PedidosProveedorID_VENDEDOR)
  else
    inherited;
end;

function TBizPedidoProveedor.GetDetalles: IBizDetallesPedidoProveedor;
begin
  Result := FDetalles;
end;

procedure TBizPedidoProveedor.OnNewRecord(Sender: TDADataTable);
begin
  inherited;
  IniciarValoresPedidoNuevo;
end;

procedure TBizPedidoProveedor.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 TBizPedidoProveedor._GetProveedor: IBizProveedor;
begin
  Result := FProveedor;
end;

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

procedure TBizPedidoProveedor.SetDetalles(Value: IBizDetallesPedidoProveedor);
begin
  FDetalles := Value;
  EnlazarMaestroDetalle(FDetallesLink, FDetalles);
end;

procedure TBizPedidoProveedor.SetFECHA_CONFIRMACIONValue(const aValue: TDateTime);
begin
  if EsFechaVacia(aValue) then
    SetFieldNull(DataTable, fld_PedidosProveedorFECHA_CONFIRMACION)
  else
    inherited;
end;

procedure TBizPedidoProveedor.SetFECHA_ENTREGAValue(const aValue: TDateTime);
begin
  if EsFechaVacia(aValue) then
    SetFieldNull(DataTable, fld_PedidosProveedorFECHA_ENTREGA)
  else
    inherited;
end;

procedure TBizPedidoProveedor.SetFECHA_ENVIOValue(const aValue: TDateTime);
begin
  if EsFechaVacia(aValue) then
     SetFieldNull(DataTable, fld_PedidosProveedorFECHA_ENVIO)
  else
    inherited;
end;

procedure TBizPedidoProveedor.SetFECHA_PEDIDOValue(const aValue: TDateTime);
begin
  if EsFechaVacia(aValue) then
    SetFieldNull(DataTable, fld_PedidosProveedorFECHA_PEDIDO)
  else
    inherited;
end;

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

procedure TBizPedidoProveedor.SetID_CONTRATO_CLIENTEValue(const aValue: Integer);
begin
  if (aValue = 0) then
    SetFieldNull(DataTable, fld_PedidosProveedorID_CONTRATO_CLIENTE)
  else
    inherited;
end;

{procedure TBizPedidoProveedor.SetINCIDENCIASValue(const aValue: IROStrings);
begin
  if not Assigned(aValue) then
    SetFieldNull(DataTable, fld_PedidosProveedorINCIDENCIAS)
  else
    inherited;
end;}

initialization
  RegisterDataTableRules(BIZ_CLIENT_PEDIDO_PROVEEDOR, TBizPedidoProveedor);

finalization

end.

