Tecsitel_FactuGES2/Source/Modulos/Pedidos a proveedor/Controller/uPedidosProveedorController.pas
roberto f3dd5216ca Version 2.0.7
petición 248
petición 265

git-svn-id: https://192.168.0.254/svn/Proyectos.Tecsitel_FactuGES2/trunk@1111 0c75b7a4-871f-7646-8a2f-f78d34cc349f
2015-02-05 17:51:58 +00:00

1071 lines
34 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 uPedidosProveedorController;
interface
uses
Classes, SysUtils, uDADataTable,
uControllerBase, uIDataModulePedidosProveedor, uProveedoresController,
uDetallesPedidoProveedorController, uBizPedidosProveedor;
type
IPedidosProveedorController = interface(IControllerBase)
['{404FFA2F-D683-447D-91E6-C9A7322934D8}']
function GetProveedorController: IProveedoresController;
procedure SetProveedorController(const Value: IProveedoresController);
property ProveedorController: IProveedoresController read GetProveedorController write SetProveedorController;
function GetDetallesController: IDetallesPedidoProveedorController;
procedure SetDetallesController(const Value: IDetallesPedidoProveedorController);
property DetallesController: IDetallesPedidoProveedorController read GetDetallesController write SetDetallesController;
function Buscar(const ID: Integer): IBizPedidoProveedor;
function BuscarTodos: IBizPedidoProveedor; overload;
function BuscarTodos(const AID_Proveedor: Integer): IBizPedidoProveedor; overload;
function BuscarPendientesRecepcion: IBizPedidoProveedor;
// function BuscarSinFacturar : IBizPedidoProveedor;
procedure Ver(APedido : IBizPedidoProveedor);
procedure VerTodos(APedidos: IBizPedidoProveedor;
const AVerModal : Boolean = False; const AWindowCaption: String = '';
const AHeaderText: String = '');
procedure VerFacturasDePedido(APedido : IBizPedidoProveedor);
procedure VerDireccionEntrega(APedido : IBizPedidoProveedor);
function Nuevo : IBizPedidoProveedor;
procedure Anadir(APedido : IBizPedidoProveedor);
function Eliminar(const ID : Integer): Boolean; overload;
function Eliminar(APedido : IBizPedidoProveedor; AllItems: Boolean = false): Boolean; overload;
function Guardar(APedido : IBizPedidoProveedor): Boolean;
procedure DescartarCambios(APedido : IBizPedidoProveedor);
function Existe(const ID: Integer) : Boolean;
function Duplicar(APedido: IBizPedidoProveedor): IBizPedidoProveedor;
procedure Preview(APedido : IBizPedidoProveedor; AllItems: Boolean = False;
const VerPrecios: Boolean = True; const VerRefProveedor: Boolean = True);
procedure Print(APedido : IBizPedidoProveedor; AllItems: Boolean = False;
const VerPrecios: Boolean = True; const VerRefProveedor: Boolean = True);
procedure RecalcularImportes(APedido: IBizPedidoProveedor);
function EsModificable(APedido : IBizPedidoProveedor): Boolean;
function EsEliminable(APedido : IBizPedidoProveedor): Boolean;
function CambiarSituacion(APedido: IBizPedidoProveedor; ASituacion : String; AFechaPagado: TDateTime = 0; DoPost : Boolean = True): Boolean; overload;
function CambiarSituacion(APedido: IBizPedidoProveedor): Boolean; overload;
function ExtraerSeleccionados(APedido: IBizPedidoProveedor) : IBizPedidoProveedor;
function ElegirPedidos(APedido: IBizPedidoProveedor; AMensaje: String; AMultiSelect: Boolean): IBizPedidoProveedor;
procedure RecuperarProveedor(APedido: IBizPedidoProveedor);
function EnviarPedidoPorEMail(APedido : IBizPedidoProveedor;
const AEnviarDirectamente: Boolean = True;
const ADireccionEMail: String = ''; const AAsuntoEMail: String = '';
const ATextoEMail: String = ''): Boolean;
function EnviarEmailPedidos(APedidos : IBizPedidoProveedor): Boolean;
function GenerarEmailPedido(APedido : IBizPedidoProveedor): Boolean;
Procedure AsignarIDObra(APedido: IBizPedidoProveedor; const IDObra: Variant);
Procedure AsignarIDAlmacen(APedido: IBizPedidoProveedor; const IDAlmacen: Variant);
function DarListaAnosPedidos: TStringList;
procedure FiltrarAno(APedido: IBizPedidoProveedor; ADynWhereDataTable: WideString; const Ano: String);
end;
TPedidosProveedorController = class(TControllerBase, IPedidosProveedorController)
protected
FDataModule : IDataModulePedidosProveedor;
FProveedorController : IProveedoresController;
FDetallesController : IDetallesPedidoProveedorController;
function GetProveedorController: IProveedoresController;
procedure SetProveedorController(const Value: IProveedoresController);
procedure RecuperarProveedor(APedido : IBizPedidoProveedor);
function GetDetallesController: IDetallesPedidoProveedorController;
procedure SetDetallesController(const Value: IDetallesPedidoProveedorController);
//Estos son los tres m<>todos a sobre escribir si se desea heredar toda la logica de
//este controller
procedure AsignarDataModule; virtual;
procedure RecuperarObjetos(APedido: IBizPedidoProveedor); virtual;
function CreateEditor(const AName : String; const IID: TGUID; out Intf): Boolean;
procedure FiltrarEmpresa(APedido: IBizPedidoProveedor);
function _Vacio : IBizPedidoProveedor;
function ValidarPedido(APedido: IBizPedidoProveedor): Boolean;
function ValidarSituacion(ASituacion: String; AFechaPedido: TDateTime;
var AFechaRecepcion: TDateTime): Boolean;
public
property ProveedorController: IProveedoresController read GetProveedorController write SetProveedorController;
property DetallesController: IDetallesPedidoProveedorController read GetDetallesController write SetDetallesController;
procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); override;
constructor Create; override;
destructor Destroy; override;
function Eliminar(const ID : Integer): Boolean; overload;
function Eliminar(APedido : IBizPedidoProveedor; AllItems: Boolean = false): Boolean; overload;
function Guardar(APedido : IBizPedidoProveedor): Boolean;
procedure DescartarCambios(APedido : IBizPedidoProveedor); virtual;
function Existe(const ID: Integer) : Boolean; virtual;
procedure Anadir(APedido : IBizPedidoProveedor);
function Buscar(const ID: Integer): IBizPedidoProveedor;
function BuscarTodos: IBizPedidoProveedor; overload;
function BuscarTodos(const AID_Proveedor: Integer): IBizPedidoProveedor; overload;
function BuscarPendientesRecepcion: IBizPedidoProveedor;
// function BuscarSinFacturar : IBizPedidoProveedor;
function Nuevo : IBizPedidoProveedor;
procedure Ver(APedido : IBizPedidoProveedor);
procedure VerTodos(APedidos: IBizPedidoProveedor;
const AVerModal : Boolean = False; const AWindowCaption: String = '';
const AHeaderText: String = '');
procedure VerFacturasDePedido(APedido : IBizPedidoProveedor);
procedure VerDireccionEntrega(APedido : IBizPedidoProveedor);
function Duplicar(APedido: IBizPedidoProveedor): IBizPedidoProveedor;
procedure Preview(APedido : IBizPedidoProveedor; AllItems: Boolean = False;
const VerPrecios: Boolean = True; const VerRefProveedor: Boolean = True);
procedure Print(APedido : IBizPedidoProveedor; AllItems: Boolean = False;
const VerPrecios: Boolean = True; const VerRefProveedor: Boolean = True);
procedure RecalcularImportes(APedido: IBizPedidoProveedor);
function EsModificable(APedido : IBizPedidoProveedor): Boolean;
function EsEliminable(APedido : IBizPedidoProveedor): Boolean;
function CambiarSituacion(APedido: IBizPedidoProveedor; ASituacion : String; AFechaRecepcion: TDateTime = 0; DoPost : Boolean = True): Boolean; overload;
function CambiarSituacion(APedido: IBizPedidoProveedor): Boolean; overload;
function ExtraerSeleccionados(APedido: IBizPedidoProveedor) : IBizPedidoProveedor;
function ElegirPedidos(APedido: IBizPedidoProveedor; AMensaje: String; AMultiSelect: Boolean): IBizPedidoProveedor;
function EnviarPedidoPorEMail(APedido : IBizPedidoProveedor;
const AEnviarDirectamente: Boolean = True;
const ADireccionEMail: String = ''; const AAsuntoEMail: String = '';
const ATextoEMail: String = ''): Boolean;
function EnviarEmailPedidos(APedidos : IBizPedidoProveedor): Boolean;
function GenerarEmailPedido(APedido : IBizPedidoProveedor): Boolean;
Procedure AsignarIDObra(APedido: IBizPedidoProveedor; const IDObra: Variant);
Procedure AsignarIDAlmacen(APedido: IBizPedidoProveedor; const IDAlmacen: Variant);
function DarListaAnosPedidos: TStringList;
procedure FiltrarAno(APedido: IBizPedidoProveedor; ADynWhereDataTable: WideString; const Ano: String);
end;
implementation
uses
uROTypes, Controls, cxControls, DB, uEditorRegistryUtils, uEditorPreview, DateUtils,
uIEditorPedidosProveedor, uDataModulePedidosProveedor, uFactuGES_App,
uBizDetallesPedidoProveedor, uBizContactos, uDataTableUtils, uDataModuleUsuarios,
schPedidosProveedorClient_Intf, uDAInterfaces, uPedidosProveedorReportController,
uDateUtils, uIEditorPedidoProveedor, uIEditorElegirPedidosProveedor, uIDialogListaPedidosProveedorEnvioEMail,
Dialogs, uIEditorDireccionEntregaPedidoProveedor, uIEditorSituacionPedidoProveedor,
Variants, uSistemaFunc, uEMailUtils, uDialogElegirEMail, uIntegerListUtils, uStringsUtils,
uPlugins_Intf, uModuleController;
{ TPedidosProveedorController }
procedure TPedidosProveedorController.Anadir(APedido: IBizPedidoProveedor);
begin
if not Assigned(APedido) then
raise Exception.Create ('Pedido no asignado (Anadir)');
APedido.Insert;
end;
procedure TPedidosProveedorController.AsignarDataModule;
begin
FDataModule := TDataModulePedidosProveedor.Create(Nil);
end;
procedure TPedidosProveedorController.AsignarIDAlmacen(APedido: IBizPedidoProveedor; const IDAlmacen: Variant);
begin
if Assigned(APedido) then
begin
if not APedido.DataTable.Editing then
APedido.DataTable.Edit;
if EsCadenaVacia(IDAlmacen) then
APedido.ID_ALMACENIsNull := true
else
APedido.ID_ALMACEN := IDAlmacen;
APedido.DataTable.Post;
end;
end;
procedure TPedidosProveedorController.AsignarIDObra(APedido: IBizPedidoProveedor; const IDObra: Variant);
begin
if Assigned(APedido) then
begin
if not APedido.DataTable.Editing then
APedido.DataTable.Edit;
if EsCadenaVacia(IDObra) then
APedido.ID_OBRAIsNull := true
else
APedido.ID_OBRA := IDObra;
APedido.DataTable.Post;
end;
end;
function TPedidosProveedorController.Buscar(const ID: Integer): IBizPedidoProveedor;
begin
Result := FDataModule.GetItem(ID);
FiltrarEmpresa(Result);
end;
function TPedidosProveedorController.BuscarPendientesRecepcion: IBizPedidoProveedor;
var
Condicion: TDAWhereExpression;
begin
ShowHourglassCursor;
try
Result := BuscarTodos;
// Filtrar los pedidos pendientes de recepcion
with Result.DataTable.DynamicWhere do
begin
// (SITUACION <> RECIBIDO)
Condicion := NewBinaryExpression(NewField('', fld_PedidosProveedorSITUACION), NewConstant(SITUACION_PEDIDO_RECIBIDO, datString), dboNotEqual);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
end;
finally
HideHourglassCursor;
end;
end;
{
function TPedidosProveedorController.BuscarSinFacturar: IBizPedidoProveedor;
var
Condicion: TDAWhereExpression;
begin
ShowHourglassCursor;
try
Result := BuscarTodos;
with Result.DataTable.DynamicWhere do
begin
// (ID_FACTURA = NULL)
Condicion := NewBinaryExpression(NewField('', fld_PedidosProveedorID_FACTURA), NewNull(), dboEqual);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
end;
finally
HideHourglassCursor;
end;
end;
}
function TPedidosProveedorController.BuscarTodos(
const AID_Proveedor: Integer): IBizPedidoProveedor;
var
Condicion: TDAWhereExpression;
begin
ShowHourglassCursor;
try
Result := BuscarTodos;
with Result.DataTable.DynamicWhere do
begin
// ID_PROVEEDOR
Condicion := NewBinaryExpression(NewField('', fld_PedidosProveedorID_PROVEEDOR),
NewConstant(AID_Proveedor, datInteger), dboEqual);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
end;
finally
HideHourglassCursor;
end;
end;
function TPedidosProveedorController.BuscarTodos: IBizPedidoProveedor;
begin
Result := FDataModule.GetItems;
FiltrarEmpresa(Result);
end;
constructor TPedidosProveedorController.Create;
begin
inherited;
AsignarDataModule;
FProveedorController := TProveedoresController.Create;
FDetallesController := TDetallesPedidoProveedorController.Create;
FDetallesController.addObservador(Self);
// Self.addSujeto(FDetallesController);
end;
function TPedidosProveedorController.CreateEditor(const AName: String;
const IID: TGUID; out Intf): Boolean;
begin
Result := Supports(EditorRegistry.CreateEditor(AName), IID, Intf);
end;
function TPedidosProveedorController.DarListaAnosPedidos: TStringList;
begin
Result := FDataModule.GetAnosItems;
end;
procedure TPedidosProveedorController.DescartarCambios(APedido: IBizPedidoProveedor);
begin
if not Assigned(APedido) then
raise Exception.Create ('Pedido no asignado');
ShowHourglassCursor;
try
if (APedido.State in dsEditModes) then
APedido.Cancel;
APedido.DataTable.CancelUpdates;
finally
HideHourglassCursor;
end;
end;
function TPedidosProveedorController.CambiarSituacion(APedido: IBizPedidoProveedor; ASituacion: String; AFechaRecepcion: TDateTime;
DoPost: Boolean): Boolean;
begin
Result := False;
if not Assigned(APedido) then
raise Exception.Create ('Pedido no asignado (CambiarSituacion)');
if not APedido.DataTable.Active then
APedido.DataTable.Active := True;
// Validar la situaci<63>n del pedido
if ValidarSituacion(ASituacion, APedido.FECHA_PEDIDO, AFechaRecepcion) then
begin
ShowHourglassCursor;
APedido.DataTable.DisableControls;
try
APedido.Edit;
APedido.SITUACION := ASituacion;
if AFechaRecepcion <> APedido.FECHA_ENTREGA then
APedido.FECHA_ENTREGA := AFechaRecepcion;
APedido.Post;
if DoPost then
Guardar(APedido);
Result := True;
finally
APedido.DataTable.EnableControls;
HideHourglassCursor;
end;
end;
end;
function TPedidosProveedorController.CambiarSituacion(APedido: IBizPedidoProveedor): Boolean;
var
AEditor : IEditorSituacionPedidoProveedor;
begin
Result := False;
AEditor := NIL;
RecuperarProveedor(APedido);
CreateEditor('EditorSituacionPedidoProveedor', IEditorSituacionPedidoProveedor, AEditor);
if Assigned(AEditor) then
try
AEditor.Controller := Self; //OJO ORDEN MUY IMPORTANTE
AEditor.PedidoProveedor := APedido;
AEditor.ShowModal;
Result := True;
finally
AEditor.Release;
AEditor := NIL;
end;
end;
destructor TPedidosProveedorController.Destroy;
begin
FDataModule := Nil;
FProveedorController := Nil;
FDetallesController := Nil;
inherited;
end;
function TPedidosProveedorController.Duplicar(
APedido: IBizPedidoProveedor): IBizPedidoProveedor;
begin
Result := Self._Vacio;
ShowHourglassCursor;
try
DuplicarRegistros(APedido.DataTable, Result.DataTable, mdrActual);
DuplicarRegistros(APedido.Detalles.DataTable, Result.Detalles.DataTable, mdrTodos);
// Hay que dejar algunos campos como si fuera un presupuesto nuevo
Result.Edit;
with Result do
begin
REFERENCIA := '';
ID_EMPRESA := AppFactuGES.EmpresaActiva.ID;
USUARIO := AppFactuGES.UsuarioActivo.UserName;
FECHA_PEDIDO := DateOf(Now);
SITUACION := SITUACION_PEDIDO_PENDIENTE;
FECHA_ENVIO := 0;
FECHA_CONFIRMACION := 0;
FECHA_ENTREGA := 0;
INCIDENCIAS_ACTIVAS := 0;
// INCIDENCIAS := Nil;
REF_PED_CLIENTE := '';
ID_PEDIDO_CLIENTE := 0;
end;
Result.Post;
finally
HideHourglassCursor;
end;
end;
function TPedidosProveedorController.ValidarPedido(
APedido: IBizPedidoProveedor): Boolean;
begin
if not Assigned(APedido) then
raise Exception.Create ('Pedido no asignado');
if (APedido.DataTable.State in dsEditModes) then
APedido.DataTable.Post;
//Tambien hacemos post de sus tablas hija
if (APedido.Detalles.DataTable.State in dsEditModes) then
APedido.Detalles.DataTable.Post;
if (APedido.ID_PROVEEDOR < 0) or (APedido.ID_PROVEEDOR = 0) then
raise Exception.Create('Debe indicar el proveedor de este pedido');
if (EsFechaVacia(APedido.FECHA_PEDIDO)) then
raise Exception.Create('Debe indicar la fecha de este pedido');
if (Length(APedido.CALLE) = 0) and (APedido.ID_ALMACEN = 0) and (APedido.ID_OBRA = 0) then
raise Exception.Create('Debe indicar una direcci<63>n de entrega o almac<61>n para este pedido');
if (APedido.Detalles.DataTable.RecordCount = 0) then
raise Exception.Create('Debe indicar al menos un concepto en el contenido del pedido');
{ Asegurarse de valores en campos "autom<6F>ticos" tanto
en MODIFICACI<43>N como en INSERCI<43>N. }
APedido.Edit;
try
APedido.USUARIO := AppFactuGES.UsuarioActivo.UserName;
if Assigned(APedido.Proveedor)
and (APedido.ID_PROVEEDOR <> APedido.Proveedor.ID) then
APedido.ID_PROVEEDOR := APedido.Proveedor.ID;
if (APedido.ID_ALMACEN = 0) then
APedido.DataTable.FieldByName(fld_PedidosProveedorID_ALMACEN).AsVariant := NULL;
if (APedido.ID_OBRA = 0) then
begin
APedido.DataTable.DisableEventHandlers; //Arreglo temporal
APedido.DataTable.FieldByName(fld_PedidosProveedorID_OBRA).AsVariant := NULL;
APedido.DataTable.EnableEventHandlers;
end;
Result := True;
finally
APedido.Post;
end;
end;
function TPedidosProveedorController.ValidarSituacion(ASituacion: String;
AFechaPedido: TDateTime; var AFechaRecepcion: TDateTime): Boolean;
begin
if ASituacion = SITUACION_PEDIDO_PENDIENTE then
AFechaRecepcion := 0
else
if (ASituacion = SITUACION_PEDIDO_PARCIAL)
or (ASituacion = SITUACION_PEDIDO_RECIBIDO) then
begin
if (EsFechaVacia(AFechaRecepcion)) then
raise Exception.Create('Hay que indicar una fecha de recepci<63>n')
else if (AFechaRecepcion < AFechaPedido) then
raise Exception.Create('La fecha de recepci<63>n debe ser posterior a la fecha del pedido');
end;
Result := True;
end;
procedure TPedidosProveedorController.Ver(APedido: IBizPedidoProveedor);
var
AEditor : IEditorPedidoProveedor;
begin
AEditor := NIL;
RecuperarObjetos(APedido);
CreateEditor('EditorPedidoProveedor', IEditorPedidoProveedor, AEditor);
if Assigned(AEditor) then
try
AEditor.Controller := Self; //OJO ORDEN MUY IMPORTANTE
AEditor.Pedido := APedido;
//MODO CONSULTAR
if not EsModificable(APedido) then
begin
SetDataTableReadOnly(APedido.DataTable, True);
AEditor.ReadOnly := True;
end;
AEditor.ShowModal;
//MODO CONSULTAR (Se deja la tabla como estaba)
if AEditor.ReadOnly then
SetDataTableReadOnly(APedido.DataTable, False);
finally
AEditor.Release;
AEditor := NIL;
end;
end;
procedure TPedidosProveedorController.VerTodos(APedidos: IBizPedidoProveedor;
const AVerModal : Boolean = False; const AWindowCaption: String = '';
const AHeaderText: String = '');
var
AEditor : IEditorPedidosProveedor;
begin
AEditor := NIL;
CreateEditor('EditorPedidosProveedor', IEditorPedidosProveedor, AEditor);
if Assigned(AEditor) then
try
if not EsCadenaVacia(AWindowCaption) then
AEditor.WindowCaption := AWindowCaption;
if not EsCadenaVacia(AHeaderText) then
AEditor.HeaderText := AHeaderText;
AEditor.Controller := Self; //OJO ORDEN MUY IMPORTANTE
AEditor.Pedidos := APedidos;
AEditor.MultiSelect := True;
if AVerModal then
AEditor.ShowModal
else
AEditor.ShowEmbedded;
finally
if AVerModal then
AEditor.Release;
AEditor := NIL;
end;
end;
procedure TPedidosProveedorController.VerDireccionEntrega(
APedido: IBizPedidoProveedor);
var
AEditor : IEditorDireccionEntregaPedidoProveedor;
begin
AEditor := NIL;
//RecuperarObjetos(APedido); <- No descomentar. No hace falta
CreateEditor('EditorDireccionEntregaPedidoProveedor', IEditorDireccionEntregaPedidoProveedor, AEditor);
if Assigned(AEditor) then
try
AEditor.Pedido := APedido;
AEditor.ShowModal;
finally
AEditor.Release;
AEditor := NIL;
end;
end;
procedure TPedidosProveedorController.VerFacturasDePedido(APedido: IBizPedidoProveedor);
var
AModule : TModuleController;
APlugin : IMCFacturasProveedor;
begin
if not Assigned(APedido) then
raise Exception.Create ('Pedido no asignado (VerFacturasDePedido)');
if APedido.DataTable.Active then
APedido.DataTable.Active := True;
AModule := AppFactuGES.GetModule(MODULENAME_FACTURAS_PROVEEDOR);
if Assigned(AModule) then
try
if Supports(AModule, IMCFacturasProveedor, APlugin) then
APlugin.VerFacturasDePedido(APedido.ID, APedido.REFERENCIA, APedido.NOMBRE);
finally
APlugin := NIL;
end;
end;
function TPedidosProveedorController._Vacio: IBizPedidoProveedor;
begin
Result := Buscar(ID_NULO);
end;
function TPedidosProveedorController.Eliminar(const ID: Integer): Boolean;
var
APedido : IBizPedidoProveedor;
begin
APedido := Buscar(ID);
if not Assigned(APedido) then
raise Exception.Create(Format('No se ha encontrado el pedido con ID = %d', [ID]));
Result := Eliminar(APedido);
APedido := NIL;
end;
function TPedidosProveedorController.ElegirPedidos(APedido: IBizPedidoProveedor; AMensaje: String; AMultiSelect: Boolean): IBizPedidoProveedor;
var
AEditor : IEditorElegirPedidosProveedor;
begin
Result := NIL;
CreateEditor('EditorElegirPedidosProveedor', IEditorElegirPedidosProveedor, AEditor);
if Assigned(AEditor) then
try
AEditor.Controller := Self;
AEditor.Pedidos := APedido;
AEditor.MultiSelect := AMultiSelect;
AEditor.Mensaje := AMensaje;
if IsPositiveResult(AEditor.ShowModal) then
Result := AEditor.PedidosProveedorSeleccionados;
finally
AEditor.Release;
AEditor := NIL;
end;
end;
function TPedidosProveedorController.Eliminar(APedido: IBizPedidoProveedor; 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(APedido) then
raise Exception.Create ('APedido no asignado');
ShowHourglassCursor;
try
if not APedido.DataTable.Active then
APedido.DataTable.Active := True;
if (APedido.State in dsEditModes) then
APedido.Cancel;
//Siempre eliminaremos el seleccionado
if EsEliminable(APedido) then
begin
APedido.Delete;
bEliminado := True;
end;
//En el caso de querer eliminar todos los items del objeto AAlbaran
if AllItems then
begin
with APedido.DataTable do
begin
First;
while not EOF do
begin
if EsEliminable(APedido) then
begin
APedido.Delete;
bEliminado := True
end
else Next;
end;
end;
end;
if bEliminado then
begin
APedido.DataTable.ApplyUpdates;
Result := True;
end
else
Result := False;
finally
HideHourglassCursor;
end;
end;
function TPedidosProveedorController.EnviarEmailPedidos(APedidos: IBizPedidoProveedor): Boolean;
var
ADialog : IDialogListaPedidosProveedorEnvioEMail;
ARespuesta : Integer;
begin
ADialog := NIL;
if not Assigned(APedidos) then
raise Exception.Create ('Pedidos no asignadas (EnviarPedidosPorEMail)');
if APedidos.DataTable.Active then
APedidos.DataTable.Active := True;
ShowHourglassCursor;
try
CreateEditor('DialogListaPedidosProveedorEnvioEMail', IDialogListaPedidosProveedorEnvioEMail, ADialog);
if Assigned(ADialog) then
begin
try
ADialog.Pedidos := APedidos;
ARespuesta := ADialog.ShowModal;
Result := (ARespuesta = mrOK)
finally
ADialog.Release;
end;
end;
finally
ADialog := NIL;
HideHourglassCursor;
end;
end;
function TPedidosProveedorController.EnviarPedidoPorEMail(APedido : IBizPedidoProveedor;
const AEnviarDirectamente: Boolean = True;
const ADireccionEMail: String = ''; const AAsuntoEMail: String = '';
const ATextoEMail: String = ''): Boolean;
var
AReportController : IPedidosProveedorReportController;
AFicheroTMP : TFileName;
AEMail : String;
AListaEmail : TStringList;
begin
if not Assigned(APedido) then
raise Exception.Create ('Pedido no asignado (EnviarPedidoPorEMail)');
if APedido.DataTable.Active then
APedido.DataTable.Active := True;
RecuperarProveedor(APedido);
APedido.Proveedor.DataTable.Active := True;
AFicheroTMP := DarFicheroPDFTemporal(EscapeIllegalChars(APedido.REFERENCIA));
if not EsCadenaVacia(ADireccionEMail) then
AEMail := ADireccionEMail
else begin
AListaEmail := TStringList.Create;
try
if not APedido.Proveedor.EMAIL_1IsNull then
AListaEmail.Add(APedido.Proveedor.EMAIL_1);
if not APedido.Proveedor.EMAIL_2IsNull then
AListaEmail.Add(APedido.Proveedor.EMAIL_2);
if not ElegirEMail(AListaEmail, AEMail) then
Exit;
finally
FreeANDNIL(AListaEmail);
end;
end;
ShowHourglassCursor;
AReportController := TPedidosProveedorReportController.Create;
try
AReportController.ExportToPDF(APedido.ID, AFicheroTMP);
Result := EnviarEMailMAPI('Pedido ' + APedido.REFERENCIA, '', AFicheroTMP, '', '', APedido.Proveedor.NOMBRE, AEMail, AEnviarDirectamente);
finally
DeleteFile(AFicheroTMP);
AReportController := NIL;
HideHourglassCursor;
end;
end;
function TPedidosProveedorController.EsEliminable(APedido: IBizPedidoProveedor): Boolean;
begin
if not Assigned(APedido) then
raise Exception.Create ('Pedido no asignado: EsEliminable');
Result := (APedido.SITUACION = SITUACION_PEDIDO_PENDIENTE);
end;
function TPedidosProveedorController.EsModificable(APedido: IBizPedidoProveedor): Boolean;
begin
if not Assigned(APedido) then
raise Exception.Create ('Pedido no asignado: EsModificable');
Result := (APedido.SITUACION <> SITUACION_PEDIDO_RECIBIDO);
end;
procedure TPedidosProveedorController.RecalcularImportes(
APedido: IBizPedidoProveedor);
var
bEnEdicion : Boolean;
ADetallePosAct : Integer;
begin
if not Assigned(APedido) then
raise Exception.Create ('Pedido no asignado (RecalcularImportes)');
if APedido.DataTable.Active then
APedido.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 := APedido.Detalles.POSICION;
bEnEdicion := (APedido.DataTable.State in dsEditModes);
if not bEnEdicion then
APedido.Edit;
ShowHourglassCursor;
try
APedido.IMPORTE_NETO := FDetallesController.DarTotalImporteTotal(APedido.Detalles);
APedido.IMPORTE_PORTE := FDetallesController.DarTotalPorteTotal(APedido.Detalles);
if not bEnEdicion then
APedido.Post;
finally
HideHourglassCursor;
// Restaurar la posici<63>n que ten<65>amos en los detalles.
FDetallesController.LocalizarPosicion(APedido.Detalles, ADetallePosAct);
end;
end;
procedure TPedidosProveedorController.RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable);
var
APedido : IBizPedidoProveedor;
ADetalles : IBizDetallesPedidoProveedor;
begin
inherited;
if Supports(ADataTable, IBizDetallesPedidoProveedor, ADetalles) and
Supports(ADetalles.DataTable.MasterSource.DataTable, IBizPedidoProveedor, APedido) then
begin
RecalcularImportes(APedido);
end;
end;
procedure TPedidosProveedorController.RecuperarObjetos(APedido: IBizPedidoProveedor);
begin
RecuperarProveedor(APedido);
end;
procedure TPedidosProveedorController.RecuperarProveedor(APedido: IBizPedidoProveedor);
begin
APedido._Proveedor := (FProveedorController.Buscar(APedido.ID_PROVEEDOR) as IBizProveedor);
end;
function TPedidosProveedorController.Existe(const ID: Integer): Boolean;
var
APedido : IBizPedidoProveedor;
begin
try
APedido := Buscar(ID);
Result := Assigned(APedido) and (APedido.ID = ID);
finally
APedido := NIL;
end;
end;
function TPedidosProveedorController.ExtraerSeleccionados(APedido: IBizPedidoProveedor): IBizPedidoProveedor;
var
ASeleccionados : IBizPedidoProveedor;
begin
ASeleccionados := (Self.Buscar(ID_NULO) as IBizPedidoProveedor);
CopyDataTableDA5(APedido.DataTable, ASeleccionados.DataTable, True);
Result := ASeleccionados;
end;
procedure TPedidosProveedorController.FiltrarAno(APedido: IBizPedidoProveedor; ADynWhereDataTable: WideString; const Ano: String);
var
Condicion: TDAWhereExpression;
FechaIni: String;
FechaFin: String;
begin
APedido.DataTable.DynamicWhere.Clear;
APedido.DataTable.DynamicWhere.Xml := ADynWhereDataTable;
if (Ano <> 'Todos') then
begin
// Filtrar las facturas actuales por empresa
FechaIni := '01/01/' + Ano;
FechaFin := '31/12/' + Ano;
with APedido.DataTable.DynamicWhere do
begin
// (FECHA_INICIO between FECHA_FIN)
Condicion := NewBinaryExpression(NewField('', fld_PedidosProveedorFECHA_PEDIDO), NewConstant(FechaIni, datString), dboGreaterOrEqual);
Condicion := NewBinaryExpression(NewBinaryExpression(NewField('', fld_PedidosProveedorFECHA_PEDIDO), NewConstant(FechaFin, datString), dboLessOrEqual), Condicion, dboAnd);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Condicion, Expression, dboAnd);
end;
end;
end;
procedure TPedidosProveedorController.FiltrarEmpresa(APedido: IBizPedidoProveedor);
var
Condicion: TDAWhereExpression;
begin
if APedido.DataTable.Active then
APedido.DataTable.Active := False;
// Filtrar los pedidos actuales por empresa
with APedido.DataTable.DynamicWhere do
begin
// (ID_EMPRESA >= ID)
Condicion := NewBinaryExpression(NewField('', fld_PedidosProveedorID_EMPRESA), NewConstant(AppFactuGES.EmpresaActiva.ID, datInteger), dboEqual);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
end;
end;
procedure TPedidosProveedorController.SetProveedorController(const Value: IProveedoresController);
begin
FProveedorController := Value;
end;
procedure TPedidosProveedorController.SetDetallesController(const Value: IDetallesPedidoProveedorController);
begin
FDetallesController := Value;
end;
function TPedidosProveedorController.Guardar(APedido: IBizPedidoProveedor): Boolean;
begin
Result := False;
if not Assigned(APedido) then
raise Exception.Create ('Pedido no asignada');
if not Assigned(FDetallesController) then
raise Exception.Create ('Controller detalles no asignado');
if ValidarPedido(APedido) then
begin
ShowHourglassCursor;
// Asegurarnos de que todos los importes est<73>n bien.
RecalcularImportes(APedido);
try
APedido.DataTable.ApplyUpdates;
Result := True;
finally
HideHourglassCursor;
end;
end;
end;
function TPedidosProveedorController.Nuevo: IBizPedidoProveedor;
var
APedido : IBizPedidoProveedor;
begin
APedido := FDataModule.NewItem;
FiltrarEmpresa(APedido);
APedido.DataTable.Active := True;
APedido.Insert;
Result := APedido;
end;
procedure TPedidosProveedorController.Preview(APedido: IBizPedidoProveedor; AllItems: Boolean = false;
const VerPrecios: Boolean = True; const VerRefProveedor: Boolean = True);
var
AReportController : IPedidosProveedorReportController;
ID_Pedidos: TIntegerList;
begin
AReportController := TPedidosProveedorReportController.Create;
ID_Pedidos := TIntegerList.Create;
try
//Si deseamos previsualizar todos los items del objeto albaran
if AllItems then
begin
with APedido.DataTable do
begin
First;
while not EOF do
begin
ID_Pedidos.Add(APedido.ID);
Next;
end;
end;
end
//Solo previsualizamos el item seleccionado
else
ID_Pedidos.Add(APedido.ID);
AReportController.Preview(ID_Pedidos, VerPrecios, VerRefProveedor);
finally
AReportController := NIL;
FreeANDNIL(ID_Pedidos)
end;
end;
procedure TPedidosProveedorController.Print(APedido: IBizPedidoProveedor; AllItems: Boolean = false;
const VerPrecios: Boolean = True; const VerRefProveedor: Boolean = True);
var
AReportController : IPedidosProveedorReportController;
ID_Pedidos: TIntegerList;
begin
AReportController := TPedidosProveedorReportController.Create;
ID_Pedidos := TIntegerList.Create;
try
//Si deseamos previsualizar todos los items del objeto albaran
if AllItems then
begin
with APedido.DataTable do
begin
First;
while not EOF do
begin
ID_Pedidos.Add(APedido.ID);
Next;
end;
end;
end
//Solo previsualizamos el item seleccionado
else
ID_Pedidos.Add(APedido.ID);
AReportController.Print(ID_Pedidos, VerPrecios, VerRefProveedor);
finally
AReportController := NIL;
FreeANDNIL(ID_Pedidos)
end;
end;
function TPedidosProveedorController.GetProveedorController: IProveedoresController;
begin
Result := FProveedorController;
end;
function TPedidosProveedorController.GenerarEmailPedido(APedido: IBizPedidoProveedor): Boolean;
begin
if not Assigned(APedido) then
raise Exception.Create ('Pedido no asignadas (GenerarEmailPedido)');
if APedido.DataTable.Active then
APedido.DataTable.Active := True;
ShowHourglassCursor;
try
RecuperarProveedor(APedido);
EnviarPedidoPorEMail(APedido, False);
finally
HideHourglassCursor;
end;
end;
function TPedidosProveedorController.GetDetallesController: IDetallesPedidoProveedorController;
begin
Result := FDetallesController;
end;
end.