unit uViewDatosYSeleccionClienteFinalAlbaran; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, uViewBase, StdCtrls, cxControls, cxContainer, cxEdit, cxLabel, cxDBLabel, ExtCtrls, DB, uDADataTable, uBizContactos, ComCtrls, ToolWin, ActnList, ImgList, PngImageList, cxTextEdit, cxDBEdit, pngimage, JvExControls, JvComponent, JvButton, JvTransparentButton, Mask, DBCtrls, uClientesController, dxLayoutControl, Buttons, uDAInterfaces, cxMaskEdit, cxButtonEdit, uBizAlbaranesProveedor, uBizDireccionesContacto, uDireccionesContactoController, Menus, cxLookAndFeelPainters, cxButtons, cxMemo; type IViewDatosYSeleccionClienteFinalAlbaran = interface(IViewBase) ['{45E273FC-D61A-4341-89E3-897781A4D7DA}'] function GetAlbaran: IBizAlbaranProveedor; procedure SetAlbaran(const Value: IBizAlbaranProveedor); property Albaran: IBizAlbaranProveedor read GetAlbaran write SetAlbaran; function GetCliente: IBizCliente; procedure SetCliente(Value: IBizCliente); property Cliente: IBizCliente read GetCliente write SetCliente; function GetID_Cliente: integer; procedure SetID_Cliente(const Value: integer); property ID_Cliente: integer read GetID_Cliente write SetID_Cliente; function GetOnClienteChanged : TNotifyEvent; procedure SetOnClienteChanged (const Value : TNotifyEvent); property OnClienteChanged : TNotifyEvent read GetOnClienteChanged write SetOnClienteChanged; procedure ElegirPersonaContacto; procedure ElegirDireccionCliente; procedure ElegirCliente; procedure VerFichaCliente; procedure AnadirNuevoCliente; procedure RefrescarDireccion; end; TfrViewDatosYSeleccionClienteFinalAlbaran = class(TfrViewBase, IViewDatosYSeleccionClienteFinalAlbaran) dsCliente: TDADataSource; ActionList1: TActionList; actElegirContacto: TAction; actAnadirContacto: TAction; actVerContacto: TAction; PngImageList: TPngImageList; dxLayoutControl1Group_Root: TdxLayoutGroup; dxLayoutControl1: TdxLayoutControl; dxLayoutControl1Item1: TdxLayoutItem; edtlNombre: TcxDBTextEdit; dxLayoutControl1Item2: TdxLayoutItem; edtNIFCIF: TcxDBTextEdit; Button1: TBitBtn; dxLayoutControl1Item7: TdxLayoutItem; Button2: TBitBtn; dxLayoutControl1Item8: TdxLayoutItem; Button3: TBitBtn; dxLayoutControl1Item9: TdxLayoutItem; dxLayoutControl1Group1: TdxLayoutGroup; dxLayoutControl1Group2: TdxLayoutGroup; dsAlbaran: TDADataSource; actElegirDireccion: TAction; actElegirPersonaContacto: TAction; dxLayoutControl1Item3: TdxLayoutItem; edtPersonaContacto: TcxDBTextEdit; dxLayoutControl1Group4: TdxLayoutGroup; dxLayoutControl1Item4: TdxLayoutItem; edtDireccion: TcxMemo; Button4: TButton; dxLayoutControl1Item5: TdxLayoutItem; dxLayoutControl1Group3: TdxLayoutGroup; dxLayoutControl1Item6: TdxLayoutItem; Button5: TButton; dxLayoutControl1Group5: TdxLayoutGroup; procedure actElegirContactoExecute(Sender: TObject); procedure actAnadirContactoExecute(Sender: TObject); procedure actVerContactoUpdate(Sender: TObject); procedure edtPersonaContactoPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); procedure edtDireccionPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); procedure actVerContactoExecute(Sender: TObject); procedure actElegirDireccionUpdate(Sender: TObject); procedure actElegirDireccionExecute(Sender: TObject); procedure actElegirPersonaContactoExecute(Sender: TObject); procedure actElegirPersonaContactoUpdate(Sender: TObject); private FOnClienteChanged : TNotifyEvent; FMsgElegirCliente: String; protected FClientesController : IClientesController; FDireccionesController : IDireccionesContactoController; FAlbaran : IBizAlbaranProveedor; FCliente : IBizCliente; FDireccionFinal : IBizDireccionesContacto; FDireccionEntrega : IBizDireccionesContacto; function GetCliente: IBizCliente; virtual; procedure SetCliente(Value: IBizCliente); virtual; function GetOnClienteChanged : TNotifyEvent; procedure SetOnClienteChanged (const Value : TNotifyEvent); procedure SetReadOnly(Value: Boolean); override; function GetID_Cliente: integer; virtual; procedure SetID_Cliente(const Value: integer); virtual; function GetAlbaran: IBizAlbaranProveedor; procedure SetAlbaran(const Value: IBizAlbaranProveedor); procedure EscribirTextoDireccion; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure ElegirPersonaContacto; procedure ElegirDireccionCliente; procedure ElegirCliente; procedure VerFichaCliente; procedure AnadirNuevoCliente; procedure RefrescarDireccion; property Albaran: IBizAlbaranProveedor read GetAlbaran write SetAlbaran; property Cliente: IBizCliente read GetCliente write SetCliente; property OnClienteChanged : TNotifyEvent read GetOnClienteChanged write SetOnClienteChanged; property ID_Cliente: integer read GetID_Cliente write SetID_Cliente; end; implementation {$R *.dfm} uses uDataModuleClientes, Math, uCustomView, uBizContactosPersonal, uDialogUtils; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.actElegirContactoExecute(Sender: TObject); begin ElegirCliente; end; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.actElegirDireccionExecute( Sender: TObject); begin inherited; ElegirDireccionCliente; end; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.actElegirDireccionUpdate( Sender: TObject); begin inherited; (Sender as TAction).Enabled := Assigned(FCliente.Direcciones) and (FCliente.Direcciones.Active) and (FCliente.Direcciones.RecordCount > 0); end; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.actElegirPersonaContactoExecute( Sender: TObject); begin inherited; ElegirPersonaContacto; end; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.actElegirPersonaContactoUpdate( Sender: TObject); begin inherited; (Sender as TAction).Enabled := Assigned(FCliente.Personal) and (FCliente.Personal.Active) and (FCliente.Personal.RecordCount > 0); end; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.actAnadirContactoExecute( Sender: TObject); begin AnadirNuevoCliente; end; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.actVerContactoExecute( Sender: TObject); begin inherited; VerFichaCliente; end; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.actVerContactoUpdate(Sender: TObject); begin inherited; (Sender as TAction).Enabled := (Length(edtlNombre.Text) > 0); end; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.AnadirNuevoCliente; var ACliente : IBizCliente; begin inherited; ACliente := (FClientesController.Nuevo as IBizCliente); FClientesController.Ver(ACliente); Self.Cliente := ACliente; end; constructor TfrViewDatosYSeleccionClienteFinalAlbaran.Create(AOwner: TComponent); begin inherited; FMsgElegirCliente := 'Elija el cliente al que se le realizará el presupuesto.'; FClientesController := TClientesController.Create; FDireccionesController := TDireccionesContactoController.Create; edtlNombre.Enabled := False; edtNIFCIF.Enabled := False; edtDireccion.Enabled := False; edtPersonaContacto.Enabled := False; end; destructor TfrViewDatosYSeleccionClienteFinalAlbaran.Destroy; begin FClientesController := NIL; FDireccionesController := NIL; inherited; end; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.edtDireccionPropertiesButtonClick( Sender: TObject; AButtonIndex: Integer); begin inherited; ElegirDireccionCliente; end; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.edtPersonaContactoPropertiesButtonClick( Sender: TObject; AButtonIndex: Integer); begin inherited; ElegirPersonaContacto; end; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.ElegirCliente; var ACliente : IBizCliente; begin inherited; ACliente := (FClientesController.ElegirContacto(FClientesController.BuscarTodos, FMsgElegirCliente, False) as IBizCliente); if Assigned(ACliente) then Self.Cliente := ACliente; ACliente := Nil; end; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.ElegirDireccionCliente; var ADireccion : IBizDireccionesContacto; begin inherited; FDireccionesController.CopiarDireccionFiscal(FCliente, FDireccionFinal); if (FCliente.Direcciones.RecordCount > 1) then ADireccion := FClientesController.ElegirDireccionEntrega(FCliente, 'Seleccione la dirección del cliente que quiere utilizar como dirección de envio de este albaran.') else ADireccion := FCliente.Direcciones; if Assigned(ADireccion) then begin FDireccionEntrega := ADireccion; FAlbaran.Edit; if FDireccionEntrega.IDIsNull then begin FAlbaran.ClearField('ID_DIRECCION'); FAlbaran.ClearField('IMPORTE_PORTE'); FAlbaran.ClearField('CALLE'); FAlbaran.ClearField('POBLACION'); FAlbaran.ClearField('PROVINCIA'); FAlbaran.ClearField('CODIGO_POSTAL'); FAlbaran.ClearField('TELEFONO'); FAlbaran.ClearField('PERSONA_CONTACTO'); end else begin FAlbaran.ID_DIRECCION := FDireccionEntrega.ID; FAlbaran.CALLE := FDireccionEntrega.CALLE; FAlbaran.POBLACION := FDireccionEntrega.POBLACION; FAlbaran.PROVINCIA := FDireccionEntrega.PROVINCIA; FAlbaran.CODIGO_POSTAL := FDireccionEntrega.CODIGO_POSTAL; FAlbaran.TELEFONO := FDireccionEntrega.TELEFONO; FAlbaran.PERSONA_CONTACTO := FDireccionEntrega.PERSONA_CONTACTO; FAlbaran.IMPORTE_PORTE := FDireccionEntrega.PORTE; end; EscribirTextoDireccion; end; end; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.ElegirPersonaContacto; var APersona : IBizContactoPersonal; begin inherited; APersona := FClientesController.ElegirPersonaContacto(FCliente.Personal, 'El cliente dispone de personas de contacto dadas de alta en su ficha. Seleccione la que quiere utilizar.'); if Assigned(APersona) then begin FAlbaran.Edit; FAlbaran.PERSONA_CONTACTO := APersona.NOMBRE; end; end; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.EscribirTextoDireccion; var ACadena : String; begin ACadena := ''; if Assigned(FDireccionFinal) then begin ACadena := Format('%s %s %s %s', [FDireccionFinal.CALLE, FDireccionFinal.POBLACION, FDireccionFinal.CODIGO_POSTAL, FDireccionFinal.PROVINCIA]); if (not FDireccionFinal.TELEFONOIsNull) and (FDireccionFinal.TELEFONO <> '') then ACadena := ACadena + #13#10 + 'Teléfono: ' + FDireccionFinal.TELEFONO; if (not FDireccionFinal.FAXIsNull) and (FDireccionFinal.FAX <> '') then ACadena := ACadena + #13#10 + 'Fax: ' + FDireccionFinal.FAX; end; edtDireccion.Text := ACadena; end; function TfrViewDatosYSeleccionClienteFinalAlbaran.GetCliente: IBizCliente; begin Result := FCliente; end; function TfrViewDatosYSeleccionClienteFinalAlbaran.GetID_Cliente: integer; begin Result := -1; if Assigned(FCliente) then Result := FCliente.ID; end; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.SetCliente(Value: IBizCliente); begin FCliente := Value; if Assigned(FCliente) then begin dsCliente.DataTable := FCliente.DataTable; if not FCliente.DataTable.Active then FCliente.DataTable.Active := True; //Solo podremos establecer persona de contacto si se ha asignado un cliente No se puede modificar el contacto nos viene de la ficha de cliente // if FCliente.ID > 0 then // edtPersonaContacto.Enabled := True; ElegirDireccionCliente end else begin dsCliente.DataTable := NIL; FCliente := NIL; FDireccionFinal := NIL; edtPersonaContacto.Enabled := False; end; if Assigned(FOnClienteChanged) then FOnClienteChanged(Self); end; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.SetID_Cliente(const Value: integer); begin Self.Cliente := IBizCliente(FClientesController.Buscar(Value)); end; function TfrViewDatosYSeleccionClienteFinalAlbaran.GetOnClienteChanged: TNotifyEvent; begin Result := FOnClienteChanged; end; function TfrViewDatosYSeleccionClienteFinalAlbaran.GetAlbaran: IBizAlbaranProveedor; begin Result := FAlbaran; end; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.RefrescarDireccion; begin FDireccionFinal := FDireccionesController.Nuevo; if (not FAlbaran.ID_DIRECCIONIsNull) and (FDireccionesController.Localizar(FCliente.Direcciones, FAlbaran.ID_DIRECCION)) then FDireccionesController.CopiarDireccion(FCliente.Direcciones, FDireccionFinal) else FDireccionesController.CopiarDireccionFiscal(FCliente, FDireccionFinal); EscribirTextoDireccion; end; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.SetOnClienteChanged( const Value: TNotifyEvent); begin FOnClienteChanged := Value; end; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.SetAlbaran(const Value: IBizAlbaranProveedor); begin FAlbaran := Value; if Assigned(FAlbaran) then begin dsAlbaran.DataTable := FAlbaran.DataTable; FCliente := FAlbaran.ClienteFinal; dsCliente.DataTable := FCliente.DataTable; if not FCliente.DataTable.Active then FCliente.DataTable.Active := True; //Solo podremos establecer persona de contacto si se ha asignado un cliente if FCliente.ID > 0 then edtPersonaContacto.Enabled := True; RefrescarDireccion; end else begin dsAlbaran.DataTable := NIL; FCliente := NIL; FDireccionFinal := NIL; end; end; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.SetReadOnly(Value: Boolean); begin inherited; if (csLoading in Self.ComponentState) then Exit; actAnadirContacto.Enabled := not ReadOnly; actElegirContacto.Enabled := not ReadOnly; edtPersonaContacto.Enabled := not ReadOnly; end; procedure TfrViewDatosYSeleccionClienteFinalAlbaran.VerFichaCliente; begin if not Assigned(Cliente) then ShowErrorMessage('No se ha indicado un cliente', 'El presupuesto no tiene ningún cliente asociado a mostrar.') else begin FClientesController.Ver(Cliente); if (ShowConfirmMessage('¿Desea recargar los datos del cliente?', '') = IDYES) then Self.Cliente := Cliente; end; end; end.