This repository has been archived on 2024-11-28. You can view files and clone it, but cannot push or open issues or pull requests.
LuisLeon_FactuGES/Source/Modulos/Albaranes de cliente/Views/uEditorAlbaranesCliente.pas

590 lines
19 KiB
ObjectPascal

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;
actEnviar: TAction;
Serviralbarn1: TMenuItem;
JsImprimirDialog: TJSDialog;
JsPrevisualizarDialog: TJSDialog;
actCancelarEnvio: TAction;
actConfirmarRecepcion: TAction;
TBXItem42: TTBXItem;
TBXItem43: TTBXItem;
TBXItem44: TTBXItem;
TBXSeparatorItem18: TTBXSeparatorItem;
TBXItem45: TTBXItem;
TBXSeparatorItem19: TTBXSeparatorItem;
actGenerarEtiquetas: TAction;
TBXItem38: TTBXItem;
JsListaAlbaranesNoEliminados: TJSDialog;
actGenerarOrden: TAction;
TBXItem39: TTBXItem;
actEnviarEMail: TAction;
TBXItem40: TTBXItem;
procedure FormShow(Sender: TObject);
procedure actGenerarFacturaUpdate(Sender: TObject);
procedure actGenerarFacturaExecute(Sender: TObject);
procedure actEnviarUpdate(Sender: TObject);
procedure actEnviarExecute(Sender: TObject);
procedure actEliminarUpdate(Sender: TObject);
procedure actCancelarEnvioExecute(Sender: TObject);
procedure actCancelarEnvioUpdate(Sender: TObject);
procedure actConfirmarRecepcionExecute(Sender: TObject);
procedure actConfirmarRecepcionUpdate(Sender: TObject);
procedure actGenerarEtiquetasExecute(Sender: TObject);
procedure actGenerarEtiquetasUpdate(Sender: TObject);
procedure actGenerarOrdenExecute(Sender: TObject);
procedure actEnviarEMailExecute(Sender: TObject);
procedure actEnviarEMailUpdate(Sender: TObject);
procedure OnListaAnosChange(Sender: TObject; const Text: string);
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;
procedure RefrescarInterno; 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,
cxCustomData, uGridUtils, uDBSelectionListUtils, cxControls;
{$R *.dfm}
{
*************************** TfEditorAlbaranesCliente ***************************
}
procedure TfEditorAlbaranesCliente.actCancelarEnvioExecute(Sender: TObject);
begin
inherited;
if (ShowConfirmMessage('Envío de albarán de cliente', '¿Desea cancelar el envío de este albarán de cliente?') = IDYES) then
begin
try
FController.CambiarSituacion(FAlbaranes, SITUACION_ALBARAN_PENDIENTE);
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.actCancelarEnvioUpdate(Sender: TObject);
begin
inherited;
(Sender as TAction).Enabled := HayDatos
and not (ViewGrid.NumSeleccionados > 1)
and ViewGrid.esSeleccionCeldaDatos
and (FAlbaranes.SITUACION = SITUACION_ALBARAN_ENVIADO);
end;
procedure TfEditorAlbaranesCliente.actConfirmarRecepcionExecute(Sender: TObject);
begin
inherited;
try
if FController.ValidarSituacion(SITUACION_ALBARAN_SERVIDO, FAlbaranes.FECHA_ENVIO, Now) then
FController.CambiarSituacion(FAlbaranes, SITUACION_ALBARAN_SERVIDO, FAlbaranes.FECHA_ENVIO, Now);
except
on E : Exception do
ShowErrorMessage('Error al cambiar la situación del albarán', E.Message, E);
end;
actRefrescar.Execute;
end;
procedure TfEditorAlbaranesCliente.actConfirmarRecepcionUpdate(Sender: TObject);
begin
inherited;
(Sender as TAction).Enabled := HayDatos
and not (ViewGrid.NumSeleccionados > 1)
and ViewGrid.esSeleccionCeldaDatos
and (FAlbaranes.SITUACION = SITUACION_ALBARAN_ENVIADO);
end;
procedure TfEditorAlbaranesCliente.actEliminarUpdate(Sender: TObject);
begin
inherited;
if (Sender as TAction).Enabled then
(Sender as TAction).Enabled := (FAlbaranes.SITUACION = SITUACION_ALBARAN_PENDIENTE)
and not (FAlbaranes.ID_FACTURA > 0)
end;
procedure TfEditorAlbaranesCliente.actGenerarEtiquetasExecute(Sender: TObject);
begin
inherited;
//Miramos si viene de un pedido previo, si no es asi le preguntamos si desea imprimir la referencia del cliente
if (FAlbaranes.ID_PEDIDO > 0) then
FController.EtiquetasPreview(FAlbaranes, True)
else
begin
if (Application.MessageBox('¿El albarán seleccionado no está asociado a un pedido por internet, ¿desea imprimir la referencia del cliente para las etiquetas de este albarán?', 'Atención', MB_YESNO) = IDYES) then
FController.EtiquetasPreview(FAlbaranes, True)
else
FController.EtiquetasPreview(FAlbaranes, False);
end;
end;
procedure TfEditorAlbaranesCliente.actGenerarEtiquetasUpdate(Sender: TObject);
begin
inherited;
(Sender as TAction).Enabled := HayDatos
and not (ViewGrid.NumSeleccionados > 1)
and ViewGrid.esSeleccionCeldaDatos;
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 not (ViewGrid.NumSeleccionados > 1)
and (FAlbaranes.REF_FACTURA = '')
and (FAlbaranes.SITUACION <> SITUACION_ALBARAN_PENDIENTE)
and ViewGrid.esSeleccionCeldaDatos;
end;
procedure TfEditorAlbaranesCliente.actGenerarOrdenExecute(Sender: TObject);
begin
inherited;
FController.GenerarOrdenDev(Albaranes);
end;
procedure TfEditorAlbaranesCliente.actEnviarEMailExecute(Sender: TObject);
var
AAlbaranes : IBizAlbaranCliente;
begin
inherited;
if ViewGrid.NumSeleccionados = 1 then
FController.GenerarEmailAlbaran(Albaranes)
else begin
ShowHourglassCursor;
try
SeleccionarFilasDesdeGrid(ViewGrid._FocusedView, (Albaranes as ISeleccionable).SelectedRecords);
AAlbaranes := (Controller as IAlbaranesClienteController).ExtraerSeleccionados(Albaranes, ViewGrid) as IBizAlbaranCliente;
if Assigned(AAlbaranes) then
if FController.EnviarEmailAlbaranes(AAlbaranes) then
RefrescarInterno;
finally
AAlbaranes := NIL;
HideHourglassCursor;
end;
end;
end;
procedure TfEditorAlbaranesCliente.actEnviarEMailUpdate(Sender: TObject);
begin
inherited;
if HayDatos and Assigned(ViewGrid) then
(Sender as TAction).Enabled := ViewGrid.esSeleccionCeldaDatos
and (ViewGrid.NumSeleccionados > 0)
else
(Sender as TAction).Enabled := False;
end;
procedure TfEditorAlbaranesCliente.actEnviarExecute(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
if FController.ValidarSituacion(SITUACION_ALBARAN_ENVIADO, Now) then
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.actEnviarUpdate(Sender: TObject);
begin
inherited;
(Sender as TAction).Enabled := HayDatos
and not (ViewGrid.NumSeleccionados > 1)
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
AAlbaran : IBizAlbaranCliente;
begin
inherited;
AAlbaran := FController.Duplicar(Albaranes);
try
FController.Ver(AAlbaran);
finally
actRefrescar.Execute;
end;
end;
procedure TfEditorAlbaranesCliente.EliminarInterno;
var
AAlbaranes: IBizAlbaranCliente;
AllItems: Boolean;
begin
AAlbaranes := Nil;
AllItems := False;
if MultiSelect and Assigned(ViewGrid) then
AllItems := (ViewGrid.NumSeleccionados > 1);
if AllItems then
begin
if (Application.MessageBox('¿Desea borrar los albaranes de cliente seleccionados?', 'Atención', MB_YESNO) = IDYES) then
begin
SeleccionarFilasDesdeGrid(ViewGrid._FocusedView, (Albaranes as ISeleccionable).SelectedRecords);
AAlbaranes := (Controller as IAlbaranesClienteController).ExtraerSeleccionados(Albaranes, ViewGrid) as IBizAlbaranCliente;
end
end
else begin
if (Application.MessageBox('¿Desea borrar el albarán de cliente seleccionado?', 'Atención', MB_YESNO) = IDYES) then
AAlbaranes := Albaranes;
end;
if Assigned(AAlbaranes) then
begin
FController.Eliminar(AAlbaranes, AllItems);
if AllItems then
begin
if (AAlbaranes.DataTable.RecordCount > 0) then
begin
with AAlbaranes.DataTable do
begin
First;
while not EOF do
begin
JsListaAlbaranesNoEliminados.Content.Add('Ref. albarán: ' + AAlbaranes.REFERENCIA + ' ' + AAlbaranes.NOMBRE);
Next;
end;
end;
JsListaAlbaranesNoEliminados.Execute;
end;
actRefrescar.Execute;
end;
end;
ViewGrid.GotoFirst;
end;
procedure TfEditorAlbaranesCliente.FormShow(Sender: TObject);
begin
cbxListaAnos.OnChange := OnListaAnosChange; //OJO SIEMPRE ANTES QUE EL INHERITED
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;
AAlbaranes: IBizAlbaranCliente;
AllItems: Boolean;
begin
AAlbaranes := Nil;
AllItems := False;
if MultiSelect and Assigned(ViewGrid) then
AllItems := (ViewGrid.NumSeleccionados > 1);
//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, 101 : begin // Elemento Seleccionado
if AllItems then
begin
SeleccionarFilasDesdeGrid(ViewGrid._FocusedView, (Albaranes as ISeleccionable).SelectedRecords);
AAlbaranes := (Controller as IAlbaranesClienteController).ExtraerSeleccionados(Albaranes, ViewGrid) as IBizAlbaranCliente;
end
else
AAlbaranes := Albaranes;
if Assigned(AAlbaranes) then
begin
//Con observaciones e incidencias
if JsImprimirDialog.CustomButtonResult = 101 then
FController.Print(AAlbaranes, AllItems, True)
else
FController.Print(AAlbaranes, AllItems);
RefrescarInterno;
end;
end;
end;
end;
end;
end;
procedure TfEditorAlbaranesCliente.ModificarInterno;
begin
inherited;
FController.Ver(Albaranes);
end;
procedure TfEditorAlbaranesCliente.NuevoInterno;
var
Respuesta : Integer;
AAlbaran : IBizAlbaranCliente;
IDAlbaranAux: Integer;
begin
inherited;
Respuesta := JsNuevoAlbaranDialog.Execute;
if Respuesta <> IDCANCEL then
begin
case JsNuevoAlbaranDialog.CustomButtonResult of
200 : begin // Utilizar un pedido
if ElegirPedidoYGenerarAlbaranCli(IDAlbaranAux) then
actRefrescar.Execute;
end;
100 : begin // Albaran nuevo vacio
if FController.Anadir(Albaranes) then
FController.Ver(Albaranes);
end;
end;
end;
end;
procedure TfEditorAlbaranesCliente.OnListaAnosChange(Sender: TObject; const Text: string);
begin
Controller.FiltrarAno(Albaranes, WhereDataTable, Text);
if Albaranes.DataTable.Active then
RefrescarInterno;
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;
AAlbaranes: IBizAlbaranCliente;
AllItems: Boolean;
begin
AAlbaranes := Nil;
AllItems := False;
if MultiSelect and Assigned(ViewGrid) then
AllItems := (ViewGrid.NumSeleccionados > 1);
//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, 101 : begin // Elemento Seleccionado
if AllItems then
begin
SeleccionarFilasDesdeGrid(ViewGrid._FocusedView, (Albaranes as ISeleccionable).SelectedRecords);
AAlbaranes := (Controller as IAlbaranesClienteController).ExtraerSeleccionados(Albaranes, ViewGrid) as IBizAlbaranCliente;
end
else
AAlbaranes := Albaranes;
if Assigned(AAlbaranes) then
//Con observaciones e incidencias
if JsPrevisualizarDialog.CustomButtonResult = 101 then
FController.Preview(AAlbaranes, AllItems, True)
else
FController.Preview(AAlbaranes, AllItems);
end;
end;
end;
end;
end;
procedure TfEditorAlbaranesCliente.RefrescarInterno;
begin
//Volvemos a cargar los años de las facturas
if Assigned(FController) then
ListaAnos := FController.DarListaAnosAlbaranes;
inherited;
end;
procedure TfEditorAlbaranesCliente.SetController(const Value: IAlbaranesClienteController);
begin
FController := Value;
if Assigned(FController) then
ListaAnos := FController.DarListaAnosAlbaranes;
end;
procedure TfEditorAlbaranesCliente.SetAlbaranes(const Value: IBizAlbaranCliente);
begin
FAlbaranes := Value;
if Assigned(FAlbaranes) then
begin
//Se guarda el where de la sentencia origen, por si el editor tiene filtros que
//afecten a este where y en un futuro se desea volver al where origen (filtro de año))
WhereDataTable := FAlbaranes.DataTable.Where.Clause;
dsDataTable.DataTable := FAlbaranes.DataTable;
if Assigned(ViewGrid) then
(ViewGrid as IViewAlbaranesCliente).Albaranes := Albaranes;
end;
end;
end.