Tecsitel_FactuGES2/Source/Modulos/Albaranes de cliente/Controller/uAlbaranesClienteController.pas

1050 lines
33 KiB
ObjectPascal
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

unit uAlbaranesClienteController;
interface
uses
SysUtils, uDADataTable, uEditorDBItem,
uControllerBase, uIDataModuleAlbaranesCliente, uClientesController,
uDetallesAlbaranClienteController, uBizAlbaranesCliente, uBizDireccionesContacto;
type
IAlbaranesClienteController = interface(IObservador)
['{E83F4950-400E-446B-8EB0-1609FF8FEA77}']
function GetClienteController: IClientesController;
procedure SetClienteController(const Value: IClientesController);
property ClienteController: IClientesController read GetClienteController write SetClienteController;
function GetDetallesController: IDetallesAlbaranClienteController;
procedure SetDetallesController(const Value: IDetallesAlbaranClienteController);
property DetallesController: IDetallesAlbaranClienteController read GetDetallesController write SetDetallesController;
function Buscar(const ID: Integer): IBizAlbaranCliente;
function BuscarTodos: IBizAlbaranCliente;
function BuscarAlbaranesNormales: IBizAlbaranCliente;
function BuscarAlbaranesDevolucion: IBizAlbaranCliente;
function BuscarPendientes : IBizAlbaranCliente;
function BuscarSinFacturar : IBizAlbaranCliente;
procedure Ver(AAlbaran : IBizAlbaranCliente);
procedure VerTodosAlbaranes(AAlbarans: IBizAlbaranCliente);
procedure VerTodosAlbaranesDev(AAlbarans: IBizAlbaranCliente);
procedure VerDireccionEntrega(AAlbaran : IBizAlbaranCliente);
function Nuevo : IBizAlbaranCliente;
function Anadir(AAlbaran : IBizAlbaranCliente): Boolean; overload;
function AnadirAlbaranDev(AAlbaran : IBizAlbaranCliente) : Boolean;
function Eliminar(const ID : Integer): Boolean; overload;
function Eliminar(AAlbaran : IBizAlbaranCliente; AllItems: Boolean = false): Boolean; overload;
function Guardar(AAlbaran : IBizAlbaranCliente): Boolean;
procedure DescartarCambios(AAlbaran : IBizAlbaranCliente);
function Existe(const ID: Integer) : Boolean;
function Duplicar(AAlbaran: IBizAlbaranCliente): IBizAlbaranCliente;
function ExtraerSeleccionados(AAlbaran: IBizAlbaranCliente) : IBizAlbaranCliente;
function ElegirAlbaranes(AAlbaran: IBizAlbaranCliente; AMensaje: String; AMultiSelect: Boolean): IBizAlbaranCliente;
procedure Preview(AAlbaran : IBizAlbaranCliente; AllItems: Boolean = false);
procedure Print(AAlbaran : IBizAlbaranCliente; AllItems: Boolean = false);
procedure EtiquetasPreview(AAlbaran : IBizAlbaranCliente; Const withRefCliente: Boolean);
procedure EtiquetasPrint(AAlbaran : IBizAlbaranCliente; Const withRefCliente: Boolean);
procedure RecalcularImportes(AAlbaran: IBizAlbaranCliente);
function EsModificable(AAlbaran: IBizAlbaranCliente): Boolean;
function EsEliminable(AAlbaran: IBizAlbaranCliente): Boolean;
procedure CopiarDireccionEnvio (const ADireccionEnvio: IBizDireccionesContacto;
AAlbaran: IBizAlbaranCliente);
procedure QuitarDireccionEnvio(AAlbaran: IBizAlbaranCliente);
procedure RecuperarCliente(AAlbaran: IBizAlbaranCliente);
function CambiarSituacion(AAlbaran : IBizAlbaranCliente;
ANuevaSituacion: String; AFechaEnvio : TDateTime = 0;
AFechaRecibido : TDateTime = 0;
DoPost: Boolean = True) : Boolean;
end;
TAlbaranesClienteController = class(TObservador, IAlbaranesClienteController)
protected
FDataModule : IDataModuleAlbaranesCliente;
FClienteController : IClientesController;
FDetallesController : IDetallesAlbaranClienteController;
function GetClienteController: IClientesController;
procedure SetClienteController(const Value: IClientesController);
function GetDetallesController: IDetallesAlbaranClienteController;
procedure SetDetallesController(const Value: IDetallesAlbaranClienteController);
//Estos son los tres m<>todos a sobre escribir si se desea heredar toda la logica de
//este controller
procedure AsignarDataModule; virtual;
procedure RecuperarObjetos(AAlbaran: IBizAlbaranCliente); virtual;
procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); override;
function CreateEditor(const AName : String; const IID: TGUID; out Intf): Boolean;
procedure FiltrarEmpresa(AAlbaran: IBizAlbaranCliente);
function _Vacio : IBizAlbaranCliente;
function ValidarAlbaran(AAlbaran: IBizAlbaranCliente): Boolean;
function ValidarSituacion(ASituacion: String;
AFechaAlbaran : TDateTime;
var AFechaEnvio : TDateTime;
var AFechaRecibido : TDateTime) : Boolean;
public
property ClienteController: IClientesController read GetClienteController write SetClienteController;
property DetallesController: IDetallesAlbaranClienteController read GetDetallesController write SetDetallesController;
constructor Create; override;
destructor Destroy; override;
function Eliminar(const ID : Integer): Boolean; overload;
function Eliminar(AAlbaran : IBizAlbaranCliente; AllItems: Boolean = false): Boolean; overload;
function Guardar(AAlbaran : IBizAlbaranCliente): Boolean;
procedure DescartarCambios(AAlbaran : IBizAlbaranCliente); virtual;
function Existe(const ID: Integer) : Boolean; virtual;
function Anadir(AAlbaran : IBizAlbaranCliente): Boolean; overload;
function AnadirAlbaranDev(AAlbaran : IBizAlbaranCliente) : Boolean;
function Buscar(const ID: Integer): IBizAlbaranCliente;
function BuscarTodos: IBizAlbaranCliente;
function BuscarAlbaranesNormales: IBizAlbaranCliente;
function BuscarAlbaranesDevolucion: IBizAlbaranCliente;
function BuscarPendientes : IBizAlbaranCliente;
function BuscarSinFacturar : IBizAlbaranCliente;
function Nuevo : IBizAlbaranCliente;
procedure Ver(AAlbaran : IBizAlbaranCliente);
procedure VerTodosAlbaranes(AAlbarans: IBizAlbaranCliente);
procedure VerTodosAlbaranesDev(AAlbarans: IBizAlbaranCliente);
procedure VerDireccionEntrega(AAlbaran : IBizAlbaranCliente);
function Duplicar(AAlbaran: IBizAlbaranCliente): IBizAlbaranCliente;
procedure CopiarDireccionEnvio (const ADireccionEnvio: IBizDireccionesContacto;
AAlbaran: IBizAlbaranCliente);
procedure QuitarDireccionEnvio(AAlbaran: IBizAlbaranCliente);
function ExtraerSeleccionados(AAlbaran: IBizAlbaranCliente) : IBizAlbaranCliente;
function ElegirAlbaranes(AAlbaran: IBizAlbaranCliente; AMensaje: String; AMultiSelect: Boolean): IBizAlbaranCliente;
procedure RecuperarCliente(AAlbaran : IBizAlbaranCliente);
procedure RecalcularImportes(AAlbaran: IBizAlbaranCliente);
function EsModificable(AAlbaran: IBizAlbaranCliente): Boolean;
function EsEliminable(AAlbaran: IBizAlbaranCliente): Boolean;
function CambiarSituacion(AAlbaran : IBizAlbaranCliente;
ANuevaSituacion: String; AFechaEnvio : TDateTime = 0;
AFechaRecibido : TDateTime = 0;
DoPost: Boolean = True) : Boolean;
procedure Preview(AAlbaran : IBizAlbaranCliente; AllItems: Boolean = false);
procedure Print(AAlbaran : IBizAlbaranCliente; AllItems: Boolean = false);
procedure EtiquetasPreview(AAlbaran : IBizAlbaranCliente; Const withRefCliente: Boolean);
procedure EtiquetasPrint(AAlbaran : IBizAlbaranCliente; Const withRefCliente: Boolean);
end;
implementation
uses
uROTypes, Controls, cxControls, DB, uEditorRegistryUtils, uEditorPreview, DateUtils,
uIEditorAlbaranesCliente, uIEditorAlbaranesDevCliente, uIEditorAlbaranDevCliente,
uDataModuleAlbaranesCliente, Variants, uBizDetallesAlbaranCliente,
uBizContactos, uDataTableUtils, uDataModuleUsuarios, Classes, uFactuGES_App,
schAlbaranesClienteClient_Intf, uDAInterfaces, uDateUtils, uIEditorAlbaranCliente,
uIEditorElegirAlbaranesCliente, uIEditorDireccionEntregaAlbaranCliente,
schContactosClient_Intf, uAlbaranesClienteReportController, uControllerDetallesBase,
// Pedidos no estar<61> en TECSITEL
// uPedidosClienteController, uBizPedidosCliente, uBizDetallesPedidoCliente, schPedidosClienteClient_Intf,
uDialogUtils, Windows, Forms, Dialogs, uGUIBase;
{ TAlbaranesClienteController }
function TAlbaranesClienteController.Anadir(AAlbaran: IBizAlbaranCliente): Boolean;
begin
if not Assigned(AAlbaran) then
raise Exception.Create ('Albar<61>n no asignado (Anadir)');
if not AAlbaran.DataTable.Active then
AAlbaran.DataTable.Active := True;
AAlbaran.Insert;
Result := True;
end;
function TAlbaranesClienteController.AnadirAlbaranDev(AAlbaran: IBizAlbaranCliente): Boolean;
begin
Result := Anadir(AAlbaran);
AAlbaran.TIPO := CTE_TIPO_ALBARAN_DEV;
end;
procedure TAlbaranesClienteController.AsignarDataModule;
begin
FDataModule := TDataModuleAlbaranesCliente.Create(Nil);
end;
function TAlbaranesClienteController.Buscar(const ID: Integer): IBizAlbaranCliente;
begin
Result := FDataModule.GetItem(ID);
FiltrarEmpresa(Result);
end;
function TAlbaranesClienteController.BuscarAlbaranesDevolucion: IBizAlbaranCliente;
var
Condicion: TDAWhereExpression;
begin
ShowHourglassCursor;
try
Result := BuscarTodos;
with Result.DataTable.DynamicWhere do
begin
// (IMPORTE_TOTAL < 0)
Condicion := NewBinaryExpression(NewField('', fld_AlbaranesClienteIMPORTE_TOTAL), NewConstant(0, datCurrency), dboLess);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
end;
finally
HideHourglassCursor;
end;
end;
function TAlbaranesClienteController.BuscarAlbaranesNormales: IBizAlbaranCliente;
var
Condicion: TDAWhereExpression;
begin
ShowHourglassCursor;
try
Result := BuscarTodos;
with Result.DataTable.DynamicWhere do
begin
// (IMPORTE_TOTAL >= 0)
Condicion := NewBinaryExpression(NewField('', fld_AlbaranesClienteIMPORTE_TOTAL), NewConstant(0, datCurrency), dboGreaterOrEqual);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
end;
finally
HideHourglassCursor;
end;
end;
function TAlbaranesClienteController.BuscarTodos: IBizAlbaranCliente;
begin
Result := FDataModule.GetItems;
FiltrarEmpresa(Result);
end;
function TAlbaranesClienteController.BuscarPendientes: IBizAlbaranCliente;
var
Condicion: TDAWhereExpression;
begin
ShowHourglassCursor;
try
Result := BuscarAlbaranesNormales;
with Result.DataTable.DynamicWhere do
begin
// (SITUACION = SERVIDO)
Condicion := NewBinaryExpression(NewField('', fld_AlbaranesClienteSITUACION), NewConstant(SITUACION_ALBARAN_SERVIDO, datString), dboEqual);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
end;
finally
HideHourglassCursor;
end;
end;
function TAlbaranesClienteController.BuscarSinFacturar: IBizAlbaranCliente;
var
Condicion: TDAWhereExpression;
begin
ShowHourglassCursor;
try
Result := BuscarAlbaranesNormales;
with Result.DataTable.DynamicWhere do
begin
// (ID_FACTURA = NULL)
Condicion := NewBinaryExpression(NewField('', fld_AlbaranesClienteID_FACTURA), NewNull(), dboEqual);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
end;
finally
HideHourglassCursor;
end;
end;
function TAlbaranesClienteController.CambiarSituacion(
AAlbaran: IBizAlbaranCliente; ANuevaSituacion: String; AFechaEnvio,
AFechaRecibido: TDateTime; DoPost: Boolean): Boolean;
begin
Result := False;
if not Assigned(AAlbaran) then
raise Exception.Create ('Albar<61>n no asignado (CambiarSituacion)');
if not AAlbaran.DataTable.Active then
AAlbaran.DataTable.Active := True;
// Validar la situaci<63>n del albar<61>n
if ValidarSituacion(ANuevaSituacion, AAlbaran.FECHA_ALBARAN, AFechaEnvio, AFechaRecibido) then
begin
ShowHourglassCursor;
AAlbaran.DataTable.DisableControls;
try
AAlbaran.Edit;
AAlbaran.SITUACION := ANuevaSituacion;
AAlbaran.FECHA_ENVIO := AFechaEnvio;
AAlbaran.FECHA_RECEPCION := AFechaRecibido;
AAlbaran.Post;
if DoPost then
Guardar(AAlbaran);
Result := True;
finally
AAlbaran.DataTable.EnableControls;
HideHourglassCursor;
end;
end;
end;
procedure TAlbaranesClienteController.CopiarDireccionEnvio(
const ADireccionEnvio: IBizDireccionesContacto; AAlbaran: IBizAlbaranCliente);
var
bEnEdicion : Boolean;
begin
if not Assigned(AAlbaran) then
raise Exception.Create ('Albaran no asignado (CopiarDireccionEnvio)');
if not Assigned(ADireccionEnvio) then
raise Exception.Create ('No se ha indicado la direcci<63>n (CopiarDireccionEnvio)');
if AAlbaran.DataTable.Active then
AAlbaran.DataTable.Active := True;
if ADireccionEnvio.DataTable.Active then
ADireccionEnvio.DataTable.Active := True;
bEnEdicion := (AAlbaran.DataTable.State in dsEditModes);
if not bEnEdicion then
AAlbaran.Edit;
ShowHourglassCursor;
AAlbaran.Edit;
try
AAlbaran.CALLE := ADireccionEnvio.CALLE;
AAlbaran.POBLACION := ADireccionEnvio.POBLACION;
AAlbaran.CODIGO_POSTAL := ADireccionEnvio.CODIGO_POSTAL;
AAlbaran.PROVINCIA := ADireccionEnvio.PROVINCIA;
AAlbaran.TELEFONO := ADireccionEnvio.TELEFONO;
AAlbaran.PERSONA_CONTACTO := ADireccionEnvio.PERSONA_CONTACTO;
if not bEnEdicion then
AAlbaran.Post;
finally
HideHourglassCursor;
end;
end;
constructor TAlbaranesClienteController.Create;
begin
inherited;
AsignarDataModule;
FClienteController := TClientesController.Create;
FDetallesController := TDetallesAlbaranClienteController.Create;
FDetallesController.addObservador(Self);
end;
function TAlbaranesClienteController.CreateEditor(const AName: String;
const IID: TGUID; out Intf): Boolean;
begin
Result := Supports(EditorRegistry.CreateEditor(AName), IID, Intf);
end;
procedure TAlbaranesClienteController.DescartarCambios(AAlbaran: IBizAlbaranCliente);
begin
if not Assigned(AAlbaran) then
raise Exception.Create ('Albar<61>n no asignado');
ShowHourglassCursor;
try
if (AAlbaran.State in dsEditModes) then
AAlbaran.Cancel;
AAlbaran.DataTable.CancelUpdates;
finally
HideHourglassCursor;
end;
end;
destructor TAlbaranesClienteController.Destroy;
begin
FDataModule := Nil;
FClienteController := Nil;
FDetallesController := Nil;
inherited;
end;
function TAlbaranesClienteController.Duplicar(AAlbaran: IBizAlbaranCliente): IBizAlbaranCliente;
begin
Result := Self._Vacio;
ShowHourglassCursor;
try
DuplicarRegistros(AAlbaran.DataTable, Result.DataTable, mdrActual);
DuplicarRegistros(AAlbaran.Detalles.DataTable, Result.Detalles.DataTable, mdrTodos);
// Hay que dejar algunos campos como si fuera un presupuesto nuevo
Result.Edit;
with Result do
begin
ID_EMPRESA := AppFactuGES.EmpresaActiva.ID;
USUARIO := AppFactuGES.UsuarioActivo.UserName;
FECHA_ALBARAN := DateOf(Now);
INCIDENCIAS_ACTIVAS := 0;
// INCIDENCIAS := Nil;
REFERENCIA := '';
FECHA_PREVISTA_ENVIO := 0;
FECHA_ENVIO := 0;
FECHA_RECEPCION := 0;
ID_FACTURA := 0;
ID_PEDIDO := 0;
end;
Result.Post;
finally
HideHourglassCursor;
end;
end;
function TAlbaranesClienteController.ValidarAlbaran(
AAlbaran: IBizAlbaranCliente): Boolean;
begin
if not Assigned(AAlbaran) then
raise Exception.Create ('Albar<61>n no asignado');
if (AAlbaran.DataTable.State in dsEditModes) then
AAlbaran.DataTable.Post;
//Tambien hacemos post de sus tablas hija
if (AAlbaran.Detalles.DataTable.State in dsEditModes) then
AAlbaran.Detalles.DataTable.Post;
if (AAlbaran.ID_Cliente < 0) or (AAlbaran.ID_Cliente = 0) then
// Si hay altas autom<6F>ticas no hay objeto Cliente pero s<> hay ID_CLIENTE
{ (not Assigned(AAlbaran.Cliente)) or
(AAlbaran.Cliente.IsEmpty) then}
raise Exception.Create('Debe indicar el cliente de este albar<61>n');
if (EsFechaVacia(AAlbaran.FECHA_ALBARAN)) then
raise Exception.Create('Debe indicar la fecha de este albar<61>n');
if (AAlbaran.Detalles.DataTable.RecordCount = 0) then
raise Exception.Create('El albar<61>n debe tener en su contenido al menos un concepto');
//En caso de ser un Albar<61>n no podra tener un importe total negativo
if (AAlbaran.TIPO = CTE_TIPO_ALBARAN) then
if (AAlbaran.IMPORTE_TOTAL < 0) then
raise Exception.Create('Un albar<61>n no puede tener un importe total negativo');
//En caso de ser una orden de devoluci<63>n no podra tener un importe total positivo
if (AAlbaran.TIPO = CTE_TIPO_ALBARAN_DEV) then
begin
if (AAlbaran.IMPORTE_TOTAL > 0) then
raise Exception.Create('Una orden de devoluci<63>n no puede tener un importe total positivo');
//Una orden de devoluci<63>n debe tener relleno el almac<61>n de entrada de material
if (AAlbaran.ID_ALMACEN < 0) or (AAlbaran.ID_ALMACEN = 0) then
raise Exception.Create('Debe indicar el almac<61>n de entrada de esta orden de devoluci<63>n');
//Ponemos la fecha del albaran de devoluci<63>n como fecha de envio para que se contabilice seg<65>n dicha fecha
AAlbaran.Edit;
AAlbaran.FECHA_ENVIO := AAlbaran.FECHA_ALBARAN;
AAlbaran.Post;
end;
//Validamos las fechas del albar<61>n
// if not (EsFechaVacia(AAlbaran.FECHA_ENVIO)) then
// if AAlbaran.FECHA_ENVIO < AAlbaran.FECHA_PREVISTA_ENVIO then
// raise Exception.Create('La fecha de envio debe ser posterior a la fecha prevista de envio');
if not (EsFechaVacia(AAlbaran.FECHA_RECEPCION)) then
if AAlbaran.FECHA_RECEPCION < AAlbaran.FECHA_ENVIO then
raise Exception.Create('La fecha de recepcion debe ser posterior a la fecha de envio');
{ Asegurarse de valores en campos "autom<6F>ticos" tanto
en MODIFICACI<43>N como en INSERCI<43>N. }
AAlbaran.Edit;
try
AAlbaran.USUARIO := AppFactuGES.UsuarioActivo.UserName;
// Lo quitamos temporalmente si no hay mas fallos de cambio de cliente se quita en todos los sitios
// if Assigned(AAlbaran.Cliente)
// and (AAlbaran.ID_CLIENTE <> AAlbaran.Cliente.ID) then
// AAlbaran.ID_CLIENTE := AAlbaran.Cliente.ID;
Result := True;
finally
AAlbaran.Post;
end;
end;
function TAlbaranesClienteController.ValidarSituacion(ASituacion: String;
AFechaAlbaran: TDateTime; var AFechaEnvio,
AFechaRecibido: TDateTime): Boolean;
begin
if ASituacion = SITUACION_ALBARAN_PENDIENTE then
begin
AFechaEnvio := 0;
AFechaRecibido := 0
end
else begin
if (ASituacion = SITUACION_ALBARAN_ENVIADO) then
begin
AFechaRecibido := 0;
if (EsFechaVacia(AFechaEnvio)) then
raise Exception.Create('Hay que indicar la fecha de env<6E>o del albar<61>n')
end;
if (ASituacion = SITUACION_ALBARAN_SERVIDO) then
begin
if (EsFechaVacia(AFechaEnvio)) then
raise Exception.Create('Hay que indicar la fecha de env<6E>o del albar<61>n');
if (EsFechaVacia(AFechaRecibido)) then
raise Exception.Create('Hay que indicar la fecha de recepci<63>n del albar<61>n');
if (AFechaRecibido < AFechaEnvio) then
raise Exception.Create('La fecha de recepci<63>n y firma del albar<61>n por parte '
+ 'del cliente no puede ser anterior a la fecha de envio del material del albar<61>n');
end;
end;
Result := True;
end;
procedure TAlbaranesClienteController.Ver(AAlbaran: IBizAlbaranCliente);
var
AEditor : IEditorDBItem;
begin
AEditor := NIL;
ShowHourglassCursor;
try
RecuperarObjetos(AAlbaran);
if (AAlbaran.TIPO = CTE_TIPO_ALBARAN) then
CreateEditor('EditorAlbaranCliente', IEditorAlbaranCliente, AEditor)
else
CreateEditor('EditorAlbaranDevCliente', IEditorAlbaranDevCliente, AEditor);
if Assigned(AEditor) then
with (AEditor as IEditorAlbaranCliente) do
begin
Controller := Self; //OJO ORDEN MUY IMPORTANTE
Albaran := AAlbaran;
//MODO CONSULTAR
if not EsModificable(AAlbaran) then
begin
SetDataTableReadOnly(AAlbaran.DataTable, True);
ReadOnly := True;
end;
ShowModal;
//MODO CONSULTAR (Se deja la tabla como estaba)
if ReadOnly then
SetDataTableReadOnly(AAlbaran.DataTable, False);
AEditor.Release;
end;
finally
AEditor := NIL;
HideHourglassCursor;
end;
end;
procedure TAlbaranesClienteController.VerDireccionEntrega(
AAlbaran: IBizAlbaranCliente);
var
AEditor : IEditorDireccionEntregaAlbaranCliente;
begin
AEditor := NIL;
ShowHourglassCursor;
try
//RecuperarObjetos(AAlbaran); <- No descomentar. No hace falta
CreateEditor('EditorDireccionEntregaAlbaranCliente', IEditorDireccionEntregaAlbaranCliente, AEditor);
if Assigned(AEditor) then
with (AEditor as IEditorDireccionEntregaAlbaranCliente) do
begin
Albaran := AAlbaran;
ShowModal;
Release;
end;
finally
AEditor := NIL;
HideHourglassCursor;
end;
end;
procedure TAlbaranesClienteController.VerTodosAlbaranes(AAlbarans: IBizAlbaranCliente);
var
AEditor : IEditorAlbaranesCliente;
begin
AEditor := NIL;
ShowHourglassCursor;
try
CreateEditor('EditorAlbaranesCliente', IEditorAlbaranesCliente, AEditor);
if Assigned(AEditor) then
with AEditor do
begin
Controller := Self; //OJO ORDEN MUY IMPORTANTE
Albaranes := AAlbarans;
MultiSelect := True;
ShowEmbedded;
end;
finally
AEditor := NIL;
HideHourglassCursor;
end;
end;
procedure TAlbaranesClienteController.VerTodosAlbaranesDev(AAlbarans: IBizAlbaranCliente);
var
AEditor : IEditorAlbaranesDevCliente;
begin
AEditor := NIL;
ShowHourglassCursor;
try
CreateEditor('EditorAlbaranesDevCliente', IEditorAlbaranesDevCliente, AEditor);
if Assigned(AEditor) then
with AEditor do
begin
Controller := Self; //OJO ORDEN MUY IMPORTANTE
Albaranes := AAlbarans;
MultiSelect := True;
ShowEmbedded;
end;
finally
AEditor := NIL;
HideHourglassCursor;
end;
end;
function TAlbaranesClienteController._Vacio: IBizAlbaranCliente;
begin
Result := Buscar(ID_NULO);
end;
function TAlbaranesClienteController.Eliminar(const ID: Integer): Boolean;
var
AAlbaran : IBizAlbaranCliente;
begin
AAlbaran := Buscar(ID);
if not Assigned(AAlbaran) then
raise Exception.Create(Format('No se ha encontrado el albar<61>n con ID = %d', [ID]));
Result := Eliminar(AAlbaran);
AAlbaran := NIL;
end;
function TAlbaranesClienteController.ElegirAlbaranes(AAlbaran: IBizAlbaranCliente; AMensaje: String; AMultiSelect: Boolean): IBizAlbaranCliente;
var
AEditor : IEditorElegirAlbaranesCliente;
begin
Result := NIL;
ShowHourglassCursor;
try
CreateEditor('EditorElegirAlbaranesCliente', IEditorElegirAlbaranesCliente, AEditor);
if Assigned(AEditor) then
with AEditor do
begin
Controller := Self;
Albaranes := AAlbaran;
MultiSelect := AMultiSelect;
Mensaje := AMensaje;
if IsPositiveResult(ShowModal) then
Result := AlbaranesClienteSeleccionados;
Release;
end;
finally
AEditor := NIL;
HideHourglassCursor;
end;
end;
function TAlbaranesClienteController.Eliminar(AAlbaran: IBizAlbaranCliente; AllItems: Boolean = false): Boolean;
//En el caso de eliminar almenos un elemento del conjunto se devuelve true
var
bEliminado: Boolean;
begin
bEliminado := False;
if not Assigned(AAlbaran) then
raise Exception.Create ('Albar<61>n no asignada');
ShowHourglassCursor;
try
if (AAlbaran.State in dsEditModes) then
AAlbaran.Cancel;
//Siempre eliminaremos el seleccionado
if EsEliminable(AAlbaran) then
begin
AAlbaran.Delete;
bEliminado := True;
end;
//En el caso de querer eliminar todos los items del objeto AAlbaran
if AllItems then
begin
with AAlbaran.DataTable do
begin
First;
while not EOF do
begin
if EsEliminable(AAlbaran) then
begin
AAlbaran.Delete;
bEliminado := True
end
else Next;
end;
end;
end;
if bEliminado then
begin
AAlbaran.DataTable.ApplyUpdates;
Result := True;
end
else
Result := False;
finally
HideHourglassCursor;
end;
end;
function TAlbaranesClienteController.EsEliminable(AAlbaran: IBizAlbaranCliente): Boolean;
begin
if not Assigned(AAlbaran) then
raise Exception.Create ('Albar<61>n no asignado: EsModificable');
Result := EsModificable(AAlbaran);
if AAlbaran.TIPO = CTE_TIPO_ALBARAN then
Result := Result and (AAlbaran.SITUACION = SITUACION_ALBARAN_PENDIENTE);
end;
function TAlbaranesClienteController.EsModificable(AAlbaran: IBizAlbaranCliente): Boolean;
begin
if not Assigned(AAlbaran) then
raise Exception.Create ('Albar<61>n no asignado: EsModificable');
Result := not (AAlbaran.ID_FACTURA > 0);
end;
procedure TAlbaranesClienteController.EtiquetasPreview(AAlbaran: IBizAlbaranCliente; Const withRefCliente: Boolean);
var
AReportController : IAlbaranesClienteReportController;
begin
AReportController := TAlbaranesClienteReportController.Create;
try
AReportController.EtiquetasPreview(AAlbaran.ID, withRefCliente);
finally
AReportController := NIL;
end;
end;
procedure TAlbaranesClienteController.EtiquetasPrint(AAlbaran: IBizAlbaranCliente; Const withRefCliente: Boolean);
var
AReportController : IAlbaranesClienteReportController;
begin
AReportController := TAlbaranesClienteReportController.Create;
try
AReportController.EtiquetasPrint(AAlbaran.ID, withRefCliente);
finally
AReportController := NIL;
end;
end;
procedure TAlbaranesClienteController.RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable);
var
AAlbaran : IBizAlbaranCliente;
ADetalles : IBizDetallesAlbaranCliente;
begin
inherited;
if Supports(ADataTable, IBizDetallesAlbaranCliente, ADetalles) and
Supports(ADetalles.DataTable.MasterSource.DataTable, IBizAlbaranCliente, AAlbaran) then
begin
RecalcularImportes(AAlbaran);
end;
end;
procedure TAlbaranesClienteController.RecuperarObjetos(AAlbaran: IBizAlbaranCliente);
begin
RecuperarCliente(AAlbaran);
end;
procedure TAlbaranesClienteController.RecuperarCliente(
AAlbaran: IBizAlbaranCliente);
begin
AAlbaran._Cliente := (FClienteController.Buscar(AAlbaran.ID_Cliente) as IBizCliente);
end;
function TAlbaranesClienteController.Existe(const ID: Integer): Boolean;
var
AAlbaran : IBizAlbaranCliente;
begin
try
AAlbaran := Buscar(ID);
Result := Assigned(AAlbaran) and (AAlbaran.ID = ID);
finally
AAlbaran := NIL;
end;
end;
function TAlbaranesClienteController.ExtraerSeleccionados(AAlbaran: IBizAlbaranCliente): IBizAlbaranCliente;
var
ASeleccionados : IBizAlbaranCliente;
begin
ASeleccionados := (Self.Buscar(ID_NULO) as IBizAlbaranCliente);
CopyDataTableDA5(AAlbaran.DataTable, ASeleccionados.DataTable, True);
Result := ASeleccionados;
end;
procedure TAlbaranesClienteController.FiltrarEmpresa(AAlbaran: IBizAlbaranCliente);
var
Condicion: TDAWhereExpression;
begin
if AAlbaran.DataTable.Active then
AAlbaran.DataTable.Active := False;
// Filtrar los presupuestos actuales por empresa
with AAlbaran.DataTable.DynamicWhere do
begin
// (ID_EMPRESA >= ID)
Condicion := NewBinaryExpression(NewField('', fld_AlbaranesClienteID_EMPRESA), NewConstant(AppFactuGES.EmpresaActiva.ID, datInteger), dboEqual);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
end;
if AAlbaran.DataTable.Active then
AAlbaran.DataTable.Active := False;
end;
procedure TAlbaranesClienteController.SetClienteController(const Value: IClientesController);
begin
FClienteController := Value;
end;
procedure TAlbaranesClienteController.SetDetallesController(const Value: IDetallesAlbaranClienteController);
begin
FDetallesController := Value;
end;
function TAlbaranesClienteController.Guardar(AAlbaran: IBizAlbaranCliente): Boolean;
begin
Result := False;
if not Assigned(AAlbaran) then
raise Exception.Create ('Albar<61>n no asignada');
if not Assigned(FDetallesController) then
raise Exception.Create ('Controller detalles no asignado');
if ValidarAlbaran(AAlbaran) then
begin
ShowHourglassCursor;
// Asegurarnos de que todos los importes est<73>n bien.
RecalcularImportes(AAlbaran);
try
AAlbaran.DataTable.ApplyUpdates;
Result := True;
finally
HideHourglassCursor;
end;
end;
end;
function TAlbaranesClienteController.Nuevo: IBizAlbaranCliente;
var
AAlbaran : IBizAlbaranCliente;
begin
AAlbaran := FDataModule.NewItem;
FiltrarEmpresa(AAlbaran);
AAlbaran.DataTable.Active := True;
AAlbaran.Insert;
Result := AAlbaran;
end;
procedure TAlbaranesClienteController.QuitarDireccionEnvio(
AAlbaran: IBizAlbaranCliente);
var
bEnEdicion : Boolean;
begin
if not Assigned(AAlbaran) then
raise Exception.Create ('Albar<61>n no asignado (QuitarDireccionEnvio)');
if AAlbaran.DataTable.Active then
AAlbaran.DataTable.Active := True;
bEnEdicion := (AAlbaran.DataTable.State in dsEditModes);
if not bEnEdicion then
AAlbaran.Edit;
ShowHourglassCursor;
AAlbaran.Edit;
try
AAlbaran.DataTable.FieldByName(fld_AlbaranesClienteCALLE).Clear;
AAlbaran.DataTable.FieldByName(fld_AlbaranesClientePOBLACION).Clear;
AAlbaran.DataTable.FieldByName(fld_AlbaranesClienteCODIGO_POSTAL).Clear;
AAlbaran.DataTable.FieldByName(fld_AlbaranesClientePROVINCIA).Clear;
AAlbaran.DataTable.FieldByName(fld_AlbaranesClienteTELEFONO).Clear;
AAlbaran.DataTable.FieldByName(fld_AlbaranesClientePERSONA_CONTACTO).Clear;
if not bEnEdicion then
AAlbaran.Post;
finally
HideHourglassCursor;
end;
end;
procedure TAlbaranesClienteController.Preview(AAlbaran: IBizAlbaranCliente; AllItems: Boolean = false);
var
AReportController : IAlbaranesClienteReportController;
ID_Albaranes: TStringList;
begin
AReportController := TAlbaranesClienteReportController.Create;
ID_Albaranes := TStringList.Create;
try
//Si deseamos previsualizar todos los items del objeto albaran
if AllItems then
begin
with AAlbaran.DataTable do
begin
First;
while not EOF do
begin
ID_Albaranes.Add(IntToStr(AAlbaran.ID));
Next;
end;
end;
end
//Solo previsualizamos el item seleccionado
else
ID_Albaranes.Add(IntToStr(AAlbaran.ID));
AReportController.Preview(ID_Albaranes.CommaText);
finally
AReportController := NIL;
ID_Albaranes.Free;
end;
end;
procedure TAlbaranesClienteController.Print(AAlbaran: IBizAlbaranCliente; AllItems: Boolean = false);
var
AReportController : IAlbaranesClienteReportController;
ID_Albaranes: TStringList;
begin
AReportController := TAlbaranesClienteReportController.Create;
ID_Albaranes := TStringList.Create;
try
//Si deseamos previsualizar todos los items del objeto albaran
if AllItems then
begin
with AAlbaran.DataTable do
begin
First;
while not EOF do
begin
ID_Albaranes.Add(IntToStr(AAlbaran.ID));
Next;
end;
end;
end
//Solo previsualizamos el item seleccionado
else
ID_Albaranes.Add(IntToStr(AAlbaran.ID));
AReportController.Print(ID_Albaranes.CommaText);
finally
AReportController := NIL;
ID_Albaranes.Free;
end;
end;
procedure TAlbaranesClienteController.RecalcularImportes(AAlbaran: IBizAlbaranCliente);
var
bEnEdicion : Boolean;
ADetallePosAct : Integer;
begin
if not Assigned(AAlbaran) then
raise Exception.Create ('Albar<61>n no asignado (RecalcularImportes)');
if AAlbaran.DataTable.Active then
AAlbaran.DataTable.Active := True;
{ Hay que guardar la posici<63>n en la que estamos en los detalles por que
la asignaci<63>n de valores a los campos IMPORTE_NETO e IMPORTE_PORTE
(ver m<>s adelante) colocan el puntero en la tabla detalle al principio.
No he encontrado la raz<61>n por la que mueve el puntero. }
ADetallePosAct := AAlbaran.Detalles.POSICION;
bEnEdicion := (AAlbaran.DataTable.State in dsEditModes);
if not bEnEdicion then
AAlbaran.Edit;
ShowHourglassCursor;
try
AAlbaran.IMPORTE_NETO := FDetallesController.DarTotalImporteTotal(AAlbaran.Detalles);
AAlbaran.IMPORTE_PORTE := FDetallesController.DarTotalPorteTotal(AAlbaran.Detalles);
if not bEnEdicion then
AAlbaran.Post;
finally
HideHourglassCursor;
// Restaurar la posici<63>n que ten<65>amos en los detalles.
FDetallesController.LocalizarPosicion(AAlbaran.Detalles, ADetallePosAct);
end;
end;
function TAlbaranesClienteController.GetClienteController: IClientesController;
begin
Result := FClienteController;
end;
function TAlbaranesClienteController.GetDetallesController: IDetallesAlbaranClienteController;
begin
Result := FDetallesController;
end;
end.