unit uEditorAlbaranesCliente; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, DB, uDADataTable, JvAppStorage, JvAppRegistryStorage, JvComponent, JvFormPlacement, ImgList, PngImageList, StdActns, ActnList, ComCtrls, TB2ExtItems, TBXExtItems, TBX, TB2Item, TB2Dock, TB2Toolbar, ExtCtrls, JvExControls, JvNavigationPane, uViewGrid, pngimage, JvComponentBase, uEditorGridBase, uBizAlbaranesCliente, uIEditorAlbaranesCliente, uAlbaranesClienteController, uCustomView, uViewBase, uViewBarraSeleccion, uViewGridBase, uViewAlbaranesCliente, JvExComCtrls, JvStatusBar, JSDialog; type TfEditorAlbaranesCliente = class(TfEditorGridBase, IEditorAlbaranesCliente) JsNuevoAlbaranDialog: TJSDialog; actGenerarFactura: TAction; N4: TMenuItem; Generarfactura1: TMenuItem; TBXSeparatorItem17: TTBXSeparatorItem; actServirAlbaran: TAction; Serviralbarn1: TMenuItem; TBXItem38: TTBXItem; JsListaFacturasGeneradas: TJSDialog; JsImprimirDialog: TJSDialog; JsPrevisualizarDialog: TJSDialog; TBXItem39: TTBXItem; procedure FormShow(Sender: TObject); procedure actGenerarFacturaUpdate(Sender: TObject); procedure actGenerarFacturaExecute(Sender: TObject); procedure actServirAlbaranUpdate(Sender: TObject); procedure actServirAlbaranExecute(Sender: TObject); procedure actEliminarUpdate(Sender: TObject); protected FAlbaranes: IBizAlbaranCliente; FController : IAlbaranesClienteController; function GetAlbaranes: IBizAlbaranCliente; procedure SetAlbaranes(const Value: IBizAlbaranCliente); function GetController : IAlbaranesClienteController; virtual; procedure SetController (const Value : IAlbaranesClienteController); virtual; procedure NuevoInterno; override; procedure ModificarInterno; override; procedure EliminarInterno; override; procedure DuplicarInterno; override; procedure ImprimirInterno; override; procedure PrevisualizarInterno; override; //Si queremos crear otra vista para el editor heredado solo tendriamos que //sobreescribir este método procedure AsignarVista; virtual; public procedure PonerTitulos(const ATitulo: string = ''); override; property Albaranes: IBizAlbaranCliente read GetAlbaranes write SetAlbaranes; property Controller : IAlbaranesClienteController read GetController write SetController; constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; implementation uses uDataModuleAlbaranesCliente, uDataModuleUsuarios, uPedidosClienteController, uBizPedidosCliente, uDialogUtils, schAlbaranesClienteClient_Intf, uFacturasClienteController, uBizFacturasCliente, uInventarioController, uEditorBase, uGenerarAlbaranesCliUtils, uGenerarFacturasCliAlbCliUtils; {$R *.dfm} { *************************** TfEditorAlbaranesCliente *************************** } procedure TfEditorAlbaranesCliente.actEliminarUpdate(Sender: TObject); begin inherited; if (Sender as TAction).Enabled then (Sender as TAction).Enabled := HayDatos and (FAlbaranes.SITUACION = SITUACION_ALBARAN_PENDIENTE); end; procedure TfEditorAlbaranesCliente.actGenerarFacturaExecute(Sender: TObject); begin GenerarFacturaCli(Albaranes.ID); actRefrescar.Execute; end; procedure TfEditorAlbaranesCliente.actGenerarFacturaUpdate(Sender: TObject); begin inherited; (Sender as TAction).Enabled := HayDatos and (FAlbaranes.REF_FACTURA = ''); end; procedure TfEditorAlbaranesCliente.actServirAlbaranExecute(Sender: TObject); var AInventarioController : IInventarioController; bCambiarEstado : Boolean; AFactura : IBizFacturaCliente; AFacturasController : IFacturasClienteController; AAlbaran : IBizAlbaranCliente; begin inherited; bCambiarEstado := False; // ¿Hay almacén asociado al albarán? if FAlbaranes.ID_ALMACEN = 0 then begin if (ShowConfirmMessage('Envío de albarán de cliente', 'Este albarán no tiene un almacén asociado por lo que no se realizará ningún cambio en el stock de los almacenes.' + #10#13 + #10#13 + '¿Desea realizar el envío de este albarán de cliente?') = IDYES) then bCambiarEstado := True // No hay almacén. Cambiamos el estado y ya está. end else begin AInventarioController := TInventarioController.Create; try bCambiarEstado := AInventarioController.SalidaAlbaran(NIL, FAlbaranes.ID_ALMACEN, FAlbaranes.Detalles); finally AInventarioController := NIL; end; end; if bCambiarEstado then begin try FController.CambiarSituacion(FAlbaranes, SITUACION_ALBARAN_ENVIADO, Now); if (ShowConfirmMessage('', 'Se ha realizado correctamente la salida del albarán de cliente. ¿Desea generar la factura de cliente correspondiente?') = IDYES) then begin AAlbaran := FController.Buscar(FAlbaranes.ID); AAlbaran.DataTable.Active := True; AFacturasController := TFacturasClienteController.Create; AFactura := AFacturasController.Nuevo; try if AFacturasController.Anadir(AFactura, AAlbaran) then AFacturasController.Ver(AFactura) finally AFacturasController := NIL; AAlbaran := NIL; AFactura := NIL; end; end; except on E : Exception do ShowErrorMessage('Error al cambiar la situación del albarán', E.Message, E); end; end; actRefrescar.Execute; end; procedure TfEditorAlbaranesCliente.actServirAlbaranUpdate(Sender: TObject); begin inherited; (Sender as TAction).Enabled := HayDatos and ViewGrid.esSeleccionCeldaDatos and (FAlbaranes.SITUACION = SITUACION_ALBARAN_PENDIENTE); end; procedure TfEditorAlbaranesCliente.AsignarVista; begin ViewGrid := CreateView(TfrViewAlbaranesCliente) as IViewAlbaranesCliente; end; constructor TfEditorAlbaranesCliente.Create(AOwner: TComponent); begin inherited; AsignarVista; end; destructor TfEditorAlbaranesCliente.Destroy; begin FAlbaranes := NIL; FController := NIL; inherited; end; procedure TfEditorAlbaranesCliente.DuplicarInterno; var APedido : IBizAlbaranCliente; begin inherited; APedido := FController.Duplicar(Albaranes); try FController.Ver(APedido); finally actRefrescar.Execute; end; end; procedure TfEditorAlbaranesCliente.EliminarInterno; begin if (Application.MessageBox('¿Desea borrar este albarán de cliente?', 'Atención', MB_YESNO) = IDYES) then begin FController.Eliminar(Albaranes); inherited; end; end; procedure TfEditorAlbaranesCliente.FormShow(Sender: TObject); begin inherited; if not Assigned(ViewGrid) then raise Exception.Create('No hay ninguna vista asignada'); if not Assigned(Albaranes) then raise Exception.Create('No hay ningún albarán asignado'); Albaranes.DataTable.Active := True; ViewGrid.GotoFirst; end; function TfEditorAlbaranesCliente.GetController: IAlbaranesClienteController; begin Result := FController; end; function TfEditorAlbaranesCliente.GetAlbaranes: IBizAlbaranCliente; begin Result := FAlbaranes; end; procedure TfEditorAlbaranesCliente.ImprimirInterno; var Respuesta : Integer; begin //Si esta agrupado solo podré imprimir la lista de elementos visibles if not ViewGrid.esSeleccionCeldaDatos then inherited else begin Respuesta := JsImprimirDialog.Execute; if Respuesta <> IDCANCEL then begin case JsImprimirDialog.CustomButtonResult of 200 : begin // Lista de elementos visibles inherited; end; 100 : begin // Elemento Seleccionado FController.Print(FAlbaranes); end; end; end; end; end; procedure TfEditorAlbaranesCliente.ModificarInterno; begin inherited; FController.Ver(Albaranes); end; procedure TfEditorAlbaranesCliente.NuevoInterno; var Respuesta : Integer; FPedidosClienteController : IPedidosClienteController; APedido : IBizPedidoCliente; begin inherited; Respuesta := JsNuevoAlbaranDialog.Execute; if Respuesta <> IDCANCEL then begin case JsNuevoAlbaranDialog.CustomButtonResult of 200 : begin // Utilizar un pedido FPedidosClienteController := TPedidosClienteController.Create; try APedido := FPedidosClienteController.ElegirPedidos(FPedidosClienteController.BuscarPendientes, 'Elija el pedido de cliente que desea utilizar para dar de alta el albarán.', False); if Assigned(APedido) then GenerarAlbaranCli(APedido); // El proceso de generación ya pregunta si el usuario quiere ver o no el albarán generado. finally FPedidosClienteController := NIL; end; end; 100 : begin // Albaran nuevo vacio if FController.Anadir(Albaranes) then FController.Ver(Albaranes); end; end; end; end; procedure TfEditorAlbaranesCliente.PonerTitulos(const ATitulo: string); var FTitulo : String; begin if (ATitulo = '') then FTitulo := 'Lista de albaranes de cliente - ' + dmUsuarios.EmpresaActual.NOMBRE else FTitulo := ATitulo; inherited PonerTitulos(FTitulo); end; procedure TfEditorAlbaranesCliente.PrevisualizarInterno; var Respuesta : Integer; begin //Si esta agrupado solo podré imprimir la lista de elementos visibles if not ViewGrid.esSeleccionCeldaDatos then inherited else begin Respuesta := JsPrevisualizarDialog.Execute; if Respuesta <> IDCANCEL then begin case JsPrevisualizarDialog.CustomButtonResult of 200 : begin // Lista de elementos visibles inherited; end; 100 : begin // Elemento Seleccionado FController.Preview(FAlbaranes); end; end; end; end; end; procedure TfEditorAlbaranesCliente.SetController(const Value: IAlbaranesClienteController); begin FController := Value; end; procedure TfEditorAlbaranesCliente.SetAlbaranes(const Value: IBizAlbaranCliente); begin FAlbaranes := Value; dsDataTable.DataTable := FAlbaranes.DataTable; if Assigned(ViewGrid) then (ViewGrid as IViewAlbaranesCliente).Albaranes := Albaranes; end; end.