2007-11-16 20:58:56 +00:00
unit uRemesasClienteController;
interface
uses
Classes, SysUtils, uDADataTable, uControllerBase, uEditorDBItem,
uIDataModuleRemesasCliente, uBizRemesasCliente, uProveedoresController,
uBizContactos, uRecibosClienteController;
type
2008-08-22 14:52:35 +00:00
IRemesasClienteController = interface( IControllerBase)
2007-11-16 20:58:56 +00:00
[ '{F5D925C6-255C-4374-9A71-DFC0FBB7FA96}' ]
function Buscar( const ID: Integer ) : IBizRemesaCliente;
function BuscarTodos: IBizRemesaCliente; overload ;
procedure Ver( ARemesaCliente : IBizRemesaCliente) ;
procedure VerTodos( ARemesasCliente: IBizRemesaCliente) ;
function Nuevo : IBizRemesaCliente;
procedure Anadir( ARemesaCliente : IBizRemesaCliente) ;
function Eliminar( const ID : Integer ) : Boolean ; overload ;
function Eliminar( ARemesaCliente : IBizRemesaCliente; AllItems: Boolean = false ) : Boolean ; overload ;
function Guardar( ARemesaCliente : IBizRemesaCliente) : Boolean ;
procedure DescartarCambios( ARemesaCliente : IBizRemesaCliente) ;
function Existe( const ID: Integer ) : Boolean ;
procedure Preview( ARemesaCliente : IBizRemesaCliente; AllItems: Boolean = false ) ;
procedure Print( ARemesaCliente : IBizRemesaCliente; AllItems: Boolean = false ) ;
function EsModificable( ARemesaProveedor : IBizRemesaCliente) : Boolean ;
function EsEliminable( ARemesaProveedor : IBizRemesaCliente) : Boolean ;
function ElegirRecibosCliente( ARemesaCliente : IBizRemesaCliente) : Boolean ;
procedure EliminarReciboCliente( ARemesaCliente : IBizRemesaCliente) ;
function GetRecibosClienteController: IRecibosClienteController;
property RecibosClienteController: IRecibosClienteController read GetRecibosClienteController;
procedure RecuperarRecibos( ARemesaCliente: IBizRemesaCliente) ;
function ExtraerSeleccionados( ARemesasCliente: IBizRemesaCliente) : IBizRemesaCliente;
end ;
2008-08-22 14:52:35 +00:00
TRemesasClienteController = class( TControllerBase, IRemesasClienteController)
2007-11-16 20:58:56 +00:00
protected
FDataModule : IDataModuleRemesasCliente;
FRecibosClienteController: IRecibosClienteController;
function GetRecibosClienteController: IRecibosClienteController;
procedure RecibirAviso( ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable) ; override ;
procedure AsignarID( ARemesaCliente: IBizRemesaCliente; const IDNuevo: Integer ) ; virtual ;
function CreateEditor( const AName : String ; const IID: TGUID; out Intf) : Boolean ;
function _Vacio : IBizRemesaCliente;
procedure FiltrarEmpresa( ARemesaCliente: IBizRemesaCliente) ;
function ValidarRemesaCliente( ARemesaCliente: IBizRemesaCliente) : Boolean ; virtual ;
procedure RecuperarRecibos( ARemesaCliente: IBizRemesaCliente) ;
procedure RecuperarObjetos( ARemesaCliente: IBizRemesaCliente) ; virtual ;
procedure AsignarDataModule; virtual ;
public
property RecibosClienteController: IRecibosClienteController read GetRecibosClienteController;
2007-11-22 19:09:07 +00:00
constructor Create; override ;
2007-11-16 20:58:56 +00:00
destructor Destroy; override ;
function Eliminar( const ID : Integer ) : Boolean ; overload ;
function Eliminar( ARemesaCliente : IBizRemesaCliente; AllItems: Boolean = false ) : Boolean ; overload ;
function Guardar( ARemesaCliente : IBizRemesaCliente) : Boolean ;
procedure DescartarCambios( ARemesaCliente : IBizRemesaCliente) ; virtual ;
function Existe( const ID: Integer ) : Boolean ; virtual ;
procedure Anadir( ARemesaCliente : IBizRemesaCliente) ; virtual ;
function Buscar( const ID: Integer ) : IBizRemesaCliente; virtual ;
function BuscarTodos: IBizRemesaCliente; overload ;
function Nuevo : IBizRemesaCliente; virtual ;
procedure Ver( ARemesaCliente : IBizRemesaCliente) ; virtual ;
procedure VerTodos( ARemesasCliente: IBizRemesaCliente) ; virtual ;
procedure Preview( ARemesaCliente : IBizRemesaCliente; AllItems: Boolean = false ) ; virtual ;
procedure Print( ARemesaCliente : IBizRemesaCliente; AllItems: Boolean = false ) ; virtual ;
function EsModificable( ARemesaProveedor : IBizRemesaCliente) : Boolean ;
function EsEliminable( ARemesaProveedor : IBizRemesaCliente) : Boolean ;
function ExtraerSeleccionados( ARemesasCliente: IBizRemesaCliente) : IBizRemesaCliente; virtual ;
function ElegirRecibosCliente( ARemesaCliente : IBizRemesaCliente) : Boolean ;
procedure EliminarReciboCliente( ARemesaCliente : IBizRemesaCliente) ;
end ;
implementation
uses
2007-11-20 15:45:03 +00:00
cxControls, DB, uEditorRegistryUtils, schRemesasClienteClient_Intf, uFactuGES_App,
2007-11-16 20:58:56 +00:00
schRecibosClienteClient_Intf, uIEditorRemesasCliente, uIEditorRemesaCliente,
Dialogs, uDataModuleRemesasCliente, uDataModuleUsuarios, uDAInterfaces,
uDataTableUtils, uDateUtils, uROTypes, DateUtils, Controls, Windows,
uBizRecibosCliente, Variants, uRemesasClienteReportController;
{ TRemesasClienteController }
procedure TRemesasClienteController. Anadir( ARemesaCliente: IBizRemesaCliente) ;
begin
ARemesaCliente. Insert;
end ;
procedure TRemesasClienteController. EliminarReciboCliente( ARemesaCliente: IBizRemesaCliente) ;
var
ARecibosRemesa : IBizRecibosCliente;
begin
inherited ;
ARecibosRemesa : = ARemesaCliente. Recibos;
RecibosClienteController. QuitarRemesa( ARecibosRemesa) ;
//Quitamos el recibo de la remesa sin que el servidor se entere para que no elimine el recibo
DesconectarTabla( ARecibosRemesa. DataTable) ;
ARecibosRemesa. DataTable. Delete;
ConectarTabla( ARecibosRemesa. DataTable) ;
ARecibosRemesa : = Nil ;
end ;
function TRemesasClienteController. EsEliminable( ARemesaProveedor: IBizRemesaCliente) : Boolean ;
begin
Result : = True ;
end ;
function TRemesasClienteController. EsModificable( ARemesaProveedor: IBizRemesaCliente) : Boolean ;
begin
Result : = True ;
end ;
procedure TRemesasClienteController. AsignarDataModule;
begin
FDataModule : = TDataModuleRemesasCliente. Create( Nil ) ;
FRecibosClienteController : = TRecibosClienteController. Create;
end ;
procedure TRemesasClienteController. AsignarID( ARemesaCliente: IBizRemesaCliente; const IDNuevo: Integer ) ;
begin
if not Assigned( ARemesaCliente) then
raise Exception. Create ( 'RemesaCliente no asignado' ) ;
ARemesaCliente. Edit;
ARemesaCliente. ID : = IDNuevo;
ARemesaCliente. Post;
end ;
function TRemesasClienteController. Buscar( const ID: Integer ) : IBizRemesaCliente;
begin
Result : = ( FDataModule as IDataModuleRemesasCliente) . GetItem( ID) ;
FiltrarEmpresa( Result ) ;
end ;
function TRemesasClienteController. BuscarTodos: IBizRemesaCliente;
begin
Result : = FDataModule. GetItems;
FiltrarEmpresa( Result ) ;
end ;
constructor TRemesasClienteController. Create;
begin
2007-11-22 19:09:07 +00:00
inherited ;
2007-11-16 20:58:56 +00:00
AsignarDataModule;
end ;
function TRemesasClienteController. CreateEditor( const AName: String ;
const IID: TGUID; out Intf) : Boolean ;
begin
Result : = Supports( EditorRegistry. CreateEditor( AName) , IID, Intf) ;
end ;
procedure TRemesasClienteController. DescartarCambios( ARemesaCliente: IBizRemesaCliente) ;
begin
if not Assigned( ARemesaCliente) then
raise Exception. Create ( 'RemesaCliente no asignado' ) ;
ShowHourglassCursor;
try
if ( ARemesaCliente. State in dsEditModes) then
ARemesaCliente. Cancel;
ARemesaCliente. DataTable. CancelUpdates;
finally
HideHourglassCursor;
end ;
end ;
destructor TRemesasClienteController. Destroy;
begin
FDataModule : = Nil ;
FRecibosClienteController : = Nil ;
inherited ;
end ;
function TRemesasClienteController. ValidarRemesaCliente( ARemesaCliente: IBizRemesaCliente) : Boolean ;
begin
2008-07-31 09:15:14 +00:00
Result : = False ;
2007-11-16 20:58:56 +00:00
if not Assigned( ARemesaCliente) then
raise Exception. Create ( 'Remesa no asignada' ) ;
if ( ARemesaCliente. DataTable. State in dsEditModes) then
ARemesaCliente. DataTable. Post;
if ARemesaCliente. DataTable. FieldByName( fld_RemesasClienteFECHA_REMESA) . IsNull then
raise Exception. Create( 'Debe indicar la fecha de esta remesa.' ) ;
if ARemesaCliente. ID_DATOS_BANCO < 1 then
raise Exception. Create( 'Debe la cuenta bancaria sobre la que realizar<61> la remesa.' ) ;
// Asegurarse de valores en campos "autom<6F> ticos"
ARemesaCliente. Edit;
try
2007-11-18 15:07:51 +00:00
ARemesaCliente. USUARIO : = AppFactuGES. UsuarioActivo. UserName;
2007-11-16 20:58:56 +00:00
Result : = True ;
finally
ARemesaCliente. Post;
end ;
end ;
procedure TRemesasClienteController. Ver( ARemesaCliente: IBizRemesaCliente) ;
var
AEditor : IEditorRemesaCliente;
begin
AEditor : = NIL ;
2008-11-11 16:22:18 +00:00
RecuperarObjetos( ARemesaCliente) ;
2007-11-16 20:58:56 +00:00
2008-11-11 16:22:18 +00:00
CreateEditor( 'EditorRemesaCliente' , IEditorRemesaCliente, AEditor) ;
if Assigned( AEditor) then
2008-11-13 13:10:32 +00:00
try
AEditor. Controller : = Self; //OJO ORDEN MUY IMPORTANTE
AEditor. RemesaCliente : = ARemesaCliente;
//MODO CONSULTAR
if not EsModificable( ARemesaCliente) then
begin
SetDataTableReadOnly( ARemesaCliente. DataTable, True ) ;
AEditor. ReadOnly : = True ;
2007-11-16 20:58:56 +00:00
end ;
2008-11-13 13:10:32 +00:00
AEditor. ShowModal;
//MODO CONSULTAR (Se deja la tabla como estaba)
if AEditor. ReadOnly then
SetDataTableReadOnly( ARemesaCliente. DataTable, False ) ;
finally
AEditor. Release;
AEditor : = NIL ;
2008-11-11 16:22:18 +00:00
end ;
2007-11-16 20:58:56 +00:00
end ;
procedure TRemesasClienteController. VerTodos( ARemesasCliente: IBizRemesaCliente) ;
var
AEditor : IEditorRemesasCliente;
begin
AEditor : = NIL ;
2008-11-11 16:22:18 +00:00
CreateEditor( 'EditorRemesasCliente' , IEditorRemesasCliente, AEditor) ;
if Assigned( AEditor) then
with ( AEditor as IEditorRemesasCliente) do
begin
2008-11-11 18:56:14 +00:00
Controller : = Self; //OJO ORDEN MUY IMPORTANTE
RemesasCliente : = ARemesasCliente;
MultiSelect : = True ;
ShowEmbedded;
2008-11-11 16:22:18 +00:00
end ;
2007-11-16 20:58:56 +00:00
end ;
function TRemesasClienteController. _Vacio: IBizRemesaCliente;
begin
Result : = Buscar( ID_NULO) ;
end ;
function TRemesasClienteController. Eliminar( const ID: Integer ) : Boolean ;
var
ARemesaCliente : IBizRemesaCliente;
begin
ARemesaCliente : = Buscar( ID) ;
if not Assigned( ARemesaCliente) then
raise Exception. Create( Format( 'No se ha encontrado la remesa con ID = %d' , [ ID] ) ) ;
Result : = Eliminar( ARemesaCliente) ;
ARemesaCliente : = NIL ;
end ;
function TRemesasClienteController. ElegirRecibosCliente( ARemesaCliente: IBizRemesaCliente) : Boolean ;
var
ARecibosRemesa : IBizRecibosCliente;
ARecibosSeleccionados : IBizRecibosCliente;
begin
Result : = False ;
ARecibosSeleccionados : = ( FRecibosClienteController. ElegirRecibos( FRecibosClienteController. BuscarRecibosARemesar, 'Elija uno o m<> s recibos para incluirlos en esta remesa' , True ) as IBizRecibosCliente) ;
if Assigned( ARecibosSeleccionados) then
begin
ShowHourglassCursor;
try
ARecibosRemesa : = ARemesaCliente. Recibos;
//Copia los recibos seleccionados a los recibos de la remesa sin que el servidor se entere de
//las inserciones
2009-01-22 08:59:18 +00:00
DuplicarRegistros( ARecibosSeleccionados. DataTable, ARecibosRemesa. DataTable, mdrTodos, True , False , True ) ;
2007-11-16 20:58:56 +00:00
FRecibosClienteController. SetSituacionCobrados( ARecibosRemesa) ;
Result : = True ;
finally
HideHourglassCursor;
end ;
end ;
ARecibosRemesa : = Nil ;
ARecibosSeleccionados : = Nil ;
end ;
function TRemesasClienteController. Eliminar( ARemesaCliente: IBizRemesaCliente; AllItems: Boolean = false ) : Boolean ;
//En el caso de eliminar almenos un elemento del conjunto se devuelve true
var
bEliminado: Boolean ;
begin
2008-05-20 18:50:02 +00:00
Result : = False ;
2007-11-16 20:58:56 +00:00
bEliminado : = False ;
if not Assigned( ARemesaCliente) then
raise Exception. Create ( 'ARemesaCliente no asignada' ) ;
ShowHourglassCursor;
try
if not ARemesaCliente. DataTable. Active then
ARemesaCliente. DataTable. Active : = True ;
if ( ARemesaCliente. State in dsEditModes) then
ARemesaCliente. Cancel;
//Siempre eliminaremos el seleccionado
if EsEliminable( ARemesaCliente) then
begin
//Si la llamada a eliminar es por el editor RemesasCliente, debo recuperar los recibos
//de la remesa a eliminar, en caso de venir por el editor RemesaCliente ya los tengo
if not Assigned( ARemesaCliente. Recibos) then
RecuperarRecibos( ARemesaCliente) ;
//Eliminaremos la remesa de los recibos asociados
With ARemesaCliente. Recibos. DataTable do
begin
First;
While not Eof do
begin
RecibosClienteController. QuitarRemesa( ARemesaCliente. Recibos) ;
Next;
end ;
end ;
//Como no est<73> n declarados como maestro-detalles debemos hacer el applyupdates nosotros
ARemesaCliente. Recibos. DataTable. ApplyUpdates;
ARemesaCliente. Delete;
bEliminado : = True ;
end ;
//En el caso de querer eliminar todos los items del objeto AAlbaran
if AllItems then
begin
with ARemesaCliente. DataTable do
begin
First;
while not EOF do
begin
if EsEliminable( ARemesaCliente) then
begin
//Si la llamada a eliminar es por el editor RemesasProveedor, debo recuperar los recibos
//de la remesa a eliminar, en caso de venir por el editor RemesaCliente ya los tengo
if not Assigned( ARemesaCliente. Recibos) then
RecuperarRecibos( ARemesaCliente) ;
//Eliminaremos la remesa de los recibos asociados
With ARemesaCliente. Recibos. DataTable do
begin
First;
While not Eof do
begin
RecibosClienteController. QuitarRemesa( ARemesaCliente. Recibos) ;
Next;
end ;
end ;
//Como no est<73> n declarados como maestro-detalles debemos hacer el applyupdates nosotros
ARemesaCliente. Recibos. DataTable. ApplyUpdates;
ARemesaCliente. Delete;
bEliminado : = True
end
else Next;
end ;
end ;
end ;
if bEliminado then
begin
ARemesaCliente. DataTable. ApplyUpdates;
Result : = True ;
end
else
Result : = False ;
HideHourglassCursor;
except
//Hay algun recibo de la remesa que tiene movimientos (Cobros/Devoluciones) posteriores al cobro inicial de la remesa
on E: Exception do
begin
ARemesaCliente. Recibos. DataTable. CancelUpdates;
ARemesaCliente. DataTable. CancelUpdates;
HideHourglassCursor;
MessageBox( 0 , 'Exiten movimientos (Cobros/Devoluciones) en los recibos posteriores al cobro inicial de la remesa' , 'Atenci<63> n' , MB_ICONWARNING or MB_OK) ;
end ;
end ;
end ;
procedure TRemesasClienteController. RecibirAviso( ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable) ;
begin
inherited ;
//
end ;
procedure TRemesasClienteController. RecuperarObjetos( ARemesaCliente: IBizRemesaCliente) ;
begin
RecuperarRecibos( ARemesaCliente) ;
end ;
procedure TRemesasClienteController. RecuperarRecibos( ARemesaCliente: IBizRemesaCliente) ;
begin
ARemesaCliente. Recibos : = RecibosClienteController. BuscarRecibosRemesa( ARemesaCliente. ID) ;
end ;
function TRemesasClienteController. Existe( const ID: Integer ) : Boolean ;
var
ARemesaCliente : IBizRemesaCliente;
begin
try
ARemesaCliente : = Buscar( ID) ;
Result : = Assigned( ARemesaCliente) and ( ARemesaCliente. ID = ID) ;
finally
ARemesaCliente : = NIL ;
end ;
end ;
function TRemesasClienteController. ExtraerSeleccionados( ARemesasCliente: IBizRemesaCliente) : IBizRemesaCliente;
var
ASeleccionados : IBizRemesaCliente;
begin
ASeleccionados : = ( Self. Buscar( ID_NULO) as IBizRemesaCliente) ;
2008-05-21 15:15:41 +00:00
CopyDataTableDA5( ARemesasCliente. DataTable, ASeleccionados. DataTable, True ) ;
2007-11-16 20:58:56 +00:00
Result : = ASeleccionados;
end ;
procedure TRemesasClienteController. FiltrarEmpresa( ARemesaCliente: IBizRemesaCliente) ;
2007-11-18 17:23:37 +00:00
var
Condicion: TDAWhereExpression;
2007-11-16 20:58:56 +00:00
begin
if ARemesaCliente. DataTable. Active then
2007-11-18 17:23:37 +00:00
ARemesaCliente. DataTable. Active : = False ;
2007-11-16 20:58:56 +00:00
2007-11-18 17:23:37 +00:00
// Filtrar las remesas actuales por empresa
2007-11-20 15:45:03 +00:00
with ARemesaCliente. DataTable. DynamicWhere do
2007-11-16 20:58:56 +00:00
begin
2007-11-18 17:23:37 +00:00
// (ID_EMPRESA >= ID)
Condicion : = NewBinaryExpression( NewField( '' , fld_RemesasClienteID_EMPRESA) , NewConstant( AppFactuGES. EmpresaActiva. ID, datInteger) , dboEqual) ;
if IsEmpty then
Expression : = Condicion
else
Expression : = NewBinaryExpression( Expression, Condicion, dboAnd) ;
2007-11-16 20:58:56 +00:00
end ;
end ;
function TRemesasClienteController. GetRecibosClienteController: IRecibosClienteController;
begin
Result : = FRecibosClienteController;
end ;
function TRemesasClienteController. Guardar( ARemesaCliente: IBizRemesaCliente) : Boolean ;
var
bEsNuevo: Boolean ;
begin
Result : = False ;
if ValidarRemesaCliente( ARemesaCliente) then
begin
ShowHourglassCursor;
try
bEsNuevo : = ARemesaCliente. EsNuevo;
//Si es nuevo debemos hacer el applyupdates por la integridad referencial de BD
if bEsNuevo then
ARemesaCliente. DataTable. ApplyUpdates;
//Si todo ha ido bien, asignamos la remesa a los recibos asociados
//Como no est<73> n declarados como maestro-detalles debemos hacer el applyupdates nosotros
2007-11-20 15:45:03 +00:00
RecibosClienteController. AsignarRemesa( ARemesaCliente. Recibos, ARemesaCliente. ID) ;
2007-11-16 20:58:56 +00:00
ARemesaCliente. Recibos. DataTable. ApplyUpdates; //En este applyupdates tambien se realizar<61> n todos los cambios acumulados sobre los recibos asociados (EliminarReciboCliente/ ElegirRecibosCliente)
//Es necesario ya que no se refrescan bien los deltas y despues del applyupdates siguen
//existiendo deltas, de esta forma los limpiamos
if ARemesaCliente. Recibos. DataTable. HasDelta then
ARemesaCliente. Recibos. DataTable. Refresh;
ARemesaCliente. DataTable. ApplyUpdates;
Result : = True ;
finally
HideHourglassCursor;
end ;
end ;
end ;
function TRemesasClienteController. Nuevo: IBizRemesaCliente;
var
ARemesaCliente : IBizRemesaCliente;
begin
ARemesaCliente : = FDataModule. NewItem;
FiltrarEmpresa( ARemesaCliente) ;
ARemesaCliente. DataTable. Active : = True ;
ARemesaCliente. Insert;
Result : = ARemesaCliente;
end ;
procedure TRemesasClienteController. Preview( ARemesaCliente: IBizRemesaCliente; AllItems: Boolean = false ) ;
var
AReportController : IRemesasClienteReportController;
ID_Remesas: TStringList;
begin
AReportController : = TRemesasClienteReportController. Create;
2008-05-20 18:50:02 +00:00
ID_Remesas : = TStringList. Create;
2007-11-16 20:58:56 +00:00
2008-05-20 18:50:02 +00:00
try
2007-11-16 20:58:56 +00:00
//Si deseamos previsualizar todos los items del objeto albaran
if AllItems then
begin
with ARemesaCliente. DataTable do
begin
First;
while not EOF do
begin
ID_Remesas. Add( IntToStr( ARemesaCliente. ID) ) ;
Next;
end ;
end ;
end
//Solo previsualizamos el item seleccionado
else
ID_Remesas. Add( IntToStr( ARemesaCliente. ID) ) ;
AReportController. Preview( ID_Remesas. CommaText) ;
finally
AReportController : = NIL ;
ID_Remesas. Free;
end ;
end ;
procedure TRemesasClienteController. Print( ARemesaCliente: IBizRemesaCliente; AllItems: Boolean = false ) ;
var
AReportController : IRemesasClienteReportController;
ID_Remesas: TStringList;
begin
AReportController : = TRemesasClienteReportController. Create;
ID_Remesas : = TStringList. Create;
2008-05-20 18:50:02 +00:00
try
2007-11-16 20:58:56 +00:00
//Si deseamos previsualizar todos los items del objeto albaran
if AllItems then
begin
with ARemesaCliente. DataTable do
begin
First;
while not EOF do
begin
ID_Remesas. Add( IntToStr( ARemesaCliente. ID) ) ;
Next;
end ;
end ;
end
//Solo previsualizamos el item seleccionado
else
ID_Remesas. Add( IntToStr( ARemesaCliente. ID) ) ;
AReportController. Print( ID_Remesas. CommaText) ;
finally
AReportController : = NIL ;
ID_Remesas. Free;
end ;
end ;
end .
2008-05-21 15:15:41 +00:00