2011-11-14 17:40:41 +00:00
unit uPedidosProveedorController;
interface
uses
2024-04-19 15:09:52 +00:00
SysUtils, uDADataTable, Classes,
2011-11-14 17:40:41 +00:00
uControllerBase, uIDataModulePedidosProveedor, uProveedoresController,
2021-02-07 17:20:37 +00:00
uDetallesPedidoProveedorController, uBizPedidosProveedor, uBizDetallesPedidoProveedor;
2011-11-14 17:40:41 +00:00
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;
function BuscarPendientesRecepcion: IBizPedidoProveedor;
2025-07-23 10:19:05 +00:00
function BuscarPedidosConArticulo( const Concepto: String ; const isEqual: Boolean = false ) : IBizPedidoProveedor;
function BuscarSinFacturar : IBizPedidoProveedor;
2011-11-14 17:40:41 +00:00
procedure Ver( APedido : IBizPedidoProveedor) ;
2025-07-23 10:19:05 +00:00
procedure VerTodos( APedidos: IBizPedidoProveedor;
const AVerModal : Boolean = False ; const AWindowCaption: String = '' ;
const AHeaderText: String = '' ) ;
procedure VerTodosPedidosConArticulo( APedidos: IBizPedidoProveedor;
const AVerModal : Boolean = False ; const AWindowCaption: String = '' ;
const AHeaderText: String = '' ) ;
2011-11-14 17:40:41 +00:00
procedure VerDireccionEntrega( APedido : IBizPedidoProveedor) ;
2025-07-23 10:19:05 +00:00
2011-11-14 17:40:41 +00:00
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;
2022-03-12 10:40:36 +00:00
procedure Preview( APedido : IBizPedidoProveedor; AllItems: Boolean = false ; const VerPrecios: Boolean = false ) ;
procedure Print( APedido : IBizPedidoProveedor; AllItems: Boolean = false ; const VerPrecios: Boolean = false ) ;
procedure EnviarPedidoPorEMail( APedido : IBizPedidoProveedor; const VerPrecios: Boolean = false ) ;
2011-11-14 17:40:41 +00:00
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) ;
2021-02-07 17:20:37 +00:00
function ArticulosPendientesDeRecibir( IDPedido: Integer ) : IBizDetallesPedidoProveedorPend;
2022-06-23 15:49:41 +00:00
function AsignarSituacion( const ASituacion: Variant ; APedidos: IBizPedidoProveedor) : boolean ;
2025-07-23 10:19:05 +00:00
Procedure AsignarContrato( APedido: IBizPedidoProveedor; const ID_CONTRATO: Integer ; AReferencia, ANombreCliente: String ) ;
2024-04-19 15:09:52 +00:00
function DarListaAnosPedidos: TStringList;
procedure FiltrarAno( APedido: IBizPedidoProveedor; ADynWhereDataTable: WideString ; const Ano: String ) ;
2011-11-14 17:40:41 +00:00
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;
function BuscarPendientesRecepcion: IBizPedidoProveedor;
2025-07-23 10:19:05 +00:00
function BuscarPedidosConArticulo( const Concepto: String ; const isEqual: Boolean = false ) : IBizPedidoProveedor;
function BuscarSinFacturar : IBizPedidoProveedor;
2011-11-14 17:40:41 +00:00
function Nuevo : IBizPedidoProveedor;
procedure Ver( APedido : IBizPedidoProveedor) ;
2025-07-23 10:19:05 +00:00
procedure VerTodos( APedidos: IBizPedidoProveedor;
const AVerModal : Boolean = False ; const AWindowCaption: String = '' ;
const AHeaderText: String = '' ) ;
procedure VerTodosPedidosConArticulo( APedidos: IBizPedidoProveedor;
const AVerModal : Boolean = False ; const AWindowCaption: String = '' ;
const AHeaderText: String = '' ) ;
2011-11-14 17:40:41 +00:00
procedure VerDireccionEntrega( APedido : IBizPedidoProveedor) ;
function Duplicar( APedido: IBizPedidoProveedor) : IBizPedidoProveedor;
2022-03-12 10:40:36 +00:00
procedure Preview( APedido : IBizPedidoProveedor; AllItems: Boolean = false ; const VerPrecios: Boolean = false ) ;
procedure Print( APedido : IBizPedidoProveedor; AllItems: Boolean = false ; const VerPrecios: Boolean = false ) ;
procedure EnviarPedidoPorEMail( APedido : IBizPedidoProveedor; const VerPrecios: Boolean = false ) ;
2011-11-14 17:40:41 +00:00
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;
2021-02-07 17:20:37 +00:00
function ArticulosPendientesDeRecibir( IDPedido: Integer ) : IBizDetallesPedidoProveedorPend;
2022-06-23 15:49:41 +00:00
function AsignarSituacion( const ASituacion: Variant ; APedidos: IBizPedidoProveedor) : boolean ;
2025-07-23 10:19:05 +00:00
Procedure AsignarContrato( APedido: IBizPedidoProveedor; const ID_CONTRATO: Integer ; AReferencia, ANombreCliente: String ) ;
2024-04-19 15:09:52 +00:00
function DarListaAnosPedidos: TStringList;
procedure FiltrarAno( APedido: IBizPedidoProveedor; ADynWhereDataTable: WideString ; const Ano: String ) ;
2011-11-14 17:40:41 +00:00
end ;
implementation
uses
uROTypes, Controls, cxControls, DB, uEditorRegistryUtils, uEditorPreview, DateUtils,
uIEditorPedidosProveedor, uDataModulePedidosProveedor, uFactuGES_App,
2021-02-07 17:20:37 +00:00
uBizContactos, uDataTableUtils, uDataModuleUsuarios, uDialogElegirEMail,
2011-11-14 17:40:41 +00:00
schPedidosProveedorClient_Intf, uDAInterfaces, uPedidosProveedorReportController,
uDateUtils, uIEditorPedidoProveedor, uIEditorElegirPedidosProveedor,
2025-07-23 10:19:05 +00:00
Dialogs, uIEditorDireccionEntregaPedidoProveedor, uIEditorResultadoPedidosConArticulo,
2022-06-23 15:49:41 +00:00
uIEditorSituacionPedidoProveedor, Variants, uSistemaFunc, uEMailUtils, uStringsUtils;
2011-11-14 17:40:41 +00:00
{ TPedidosProveedorController }
procedure TPedidosProveedorController. Anadir( APedido: IBizPedidoProveedor) ;
begin
APedido. Insert;
end ;
2021-02-07 17:20:37 +00:00
function TPedidosProveedorController. ArticulosPendientesDeRecibir( IDPedido: Integer ) : IBizDetallesPedidoProveedorPend;
var
AArticulosPendientes: IBizDetallesPedidoProveedorPend;
APedido : IBizPedidoProveedor;
begin
Result : = Nil ;
try
AArticulosPendientes : = DetallesController. ArticulosPendientes( IDPedido) ;
if not Assigned( AArticulosPendientes) then
raise Exception. Create( 'Error al recuperar los art<72> culos sin albar<61> n del pedido (ArticulosPendientesDeRecibir)' ) ;
AArticulosPendientes. DataTable. Active : = True ;
finally
result : = AArticulosPendientes;
end ;
end ;
2025-07-23 10:19:05 +00:00
procedure TPedidosProveedorController. AsignarContrato(
APedido: IBizPedidoProveedor; const ID_CONTRATO: Integer ; AReferencia,
ANombreCliente: String ) ;
begin
//Asignaremos el ID de contrato a cap<61> n as<61> como la refencia, con el fin de no tener que a<> adir relaci<63> n con modulo contratos, evitando redundancia ciclica
if not Assigned( APedido) then
raise Exception. Create ( 'Pedido no asignado (CambiarSituacion)' ) ;
if not APedido. DataTable. Active then
APedido. DataTable. Active : = True ;
ShowHourglassCursor;
APedido. DataTable. DisableControls;
try
APedido. Edit;
APedido. ID_CONTRATO_CLIENTE : = ID_CONTRATO;
APedido. REF_CON_CLIENTE : = AReferencia;
APedido. NOMBRE_CLIENTE : = ANombreCliente;
// APedido.Post;
finally
APedido. DataTable. EnableControls;
HideHourglassCursor;
end ;
end ;
2011-11-14 17:40:41 +00:00
procedure TPedidosProveedorController. AsignarDataModule;
begin
FDataModule : = TDataModulePedidosProveedor. Create( Nil ) ;
end ;
2022-06-23 15:49:41 +00:00
function TPedidosProveedorController. AsignarSituacion( const ASituacion: Variant ; APedidos: IBizPedidoProveedor) : Boolean ;
begin
ShowHourglassCursor;
if not EsCadenaVacia( ASituacion) then
begin
//Asignamos en pedido
with APedidos. DataTable do
begin
First;
while not EOF do
begin
if ( APedidos. SITUACION < > ASituacion) then
begin
Edit;
APedidos. SITUACION : = ASituacion;
Post;
end ;
Next;
end ;
ApplyUpdates;
Result : = True ;
end ;
end ;
HideHourglassCursor;
end ;
2011-11-14 17:40:41 +00:00
function TPedidosProveedorController. Buscar( const ID: Integer ) : IBizPedidoProveedor;
begin
Result : = FDataModule. GetItem( ID) ;
FiltrarEmpresa( Result ) ;
end ;
2025-07-23 10:19:05 +00:00
function TPedidosProveedorController. BuscarPedidosConArticulo( const Concepto: String ; const isEqual: Boolean = false ) : IBizPedidoProveedor;
var
AText : String ;
APedidos : IBizPedidoProveedor;
begin
APedidos : = FDataModule. GetPedidosConArticulo( Concepto, isEqual) ;
FiltrarEmpresa( APedidos) ;
AText : = Format( 'Lista de pedidos que contienen el articulo "%s"' , [ Concepto] ) ;
VerTodosPedidosConArticulo( Apedidos, True , '' , Atext) ;
end ;
2011-11-14 17:40:41 +00:00
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 ;
2025-07-23 10:19:05 +00:00
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 ;
2011-11-14 17:40:41 +00:00
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 ;
2024-04-19 15:09:52 +00:00
function TPedidosProveedorController. DarListaAnosPedidos: TStringList;
begin
Result : = FDataModule. GetAnosItems;
end ;
2011-11-14 17:40:41 +00:00
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
inherited ;
FDataModule : = Nil ;
FProveedorController : = Nil ;
FDetallesController : = Nil ;
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 ;
2025-07-23 10:19:05 +00:00
ID_ALBARANIsNull : = True ;
ID_FACTURAIsNull : = True ;
2011-11-14 17:40:41 +00:00
// INCIDENCIAS := Nil;
2021-02-07 17:20:37 +00:00
// REF_PED_CLIENTE := '';
ID_CONTRATO_CLIENTE : = 0 ;
2011-11-14 17:40:41 +00:00
end ;
Result . Post;
finally
HideHourglassCursor;
end ;
end ;
function TPedidosProveedorController. ValidarPedido(
APedido: IBizPedidoProveedor) : Boolean ;
begin
Result : = False ;
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
( not Assigned( APedido. Proveedor) ) or
( APedido. Proveedor. IsEmpty) then
raise Exception. Create( 'Debe indicar el proveedor de esta 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 ) 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<EFBFBD> N como en INSERCI<EFBFBD> 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;
Result : = True ;
finally
APedido. Post;
end ;
end ;
function TPedidosProveedorController. ValidarSituacion( ASituacion: String ;
AFechaPedido: TDateTime; var AFechaRecepcion: TDateTime) : Boolean ;
begin
Result : = False ;
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 ;
2025-07-23 10:19:05 +00:00
procedure TPedidosProveedorController. VerTodos( APedidos: IBizPedidoProveedor;
const AVerModal : Boolean = False ; const AWindowCaption: String = '' ;
const AHeaderText: String = '' ) ;
2011-11-14 17:40:41 +00:00
var
AEditor : IEditorPedidosProveedor;
begin
AEditor : = NIL ;
CreateEditor( 'EditorPedidosProveedor' , IEditorPedidosProveedor, AEditor) ;
if Assigned( AEditor) then
2025-07-23 10:19:05 +00:00
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. VerTodosPedidosConArticulo(
APedidos: IBizPedidoProveedor; const AVerModal: Boolean ; const AWindowCaption,
AHeaderText: String ) ;
var
AEditor : IEditorResultadoPedidosConArticulo;
begin
AEditor : = NIL ;
CreateEditor( 'EditorResultadoPedidosConArticulo' , IEditorResultadoPedidosConArticulo, 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 ;
2011-11-14 17:40:41 +00:00
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 ;
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 ;
2022-03-12 10:40:36 +00:00
procedure TPedidosProveedorController. EnviarPedidoPorEMail( APedido: IBizPedidoProveedor; const VerPrecios: Boolean = false ) ;
2021-02-07 17:20:37 +00:00
var
AReportController : IPedidosProveedorReportController;
AFicheroTMP : TFileName;
ATituloEnvio : String ;
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 ;
AListaEmail : = TStringList. Create;
try
RecuperarProveedor( APedido) ;
APedido. Proveedor. DataTable. Active : = True ;
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 ;
ShowHourglassCursor;
2021-05-04 09:12:20 +00:00
ATituloEnvio : = 'Pedido ref-' + APedido. REFERENCIA;
2021-02-07 17:20:37 +00:00
AFicheroTMP : = DarFicheroPDFTemporal( EscapeIllegalChars( ATituloEnvio) ) ;
AReportController : = TPedidosProveedorReportController. Create;
try
2022-03-12 10:40:36 +00:00
AReportController. ExportToPDF( APedido. ID, AFicheroTMP, VerPrecios) ;
2021-02-07 17:20:37 +00:00
SendMailMAPI( ATituloEnvio, ATituloEnvio, AFicheroTMP, '' , '' , APedido. Proveedor. NOMBRE, AEMail) ;
finally
DeleteFile( AFicheroTMP) ;
AReportController : = NIL ;
HideHourglassCursor;
end ;
end ;
2011-11-14 17:40:41 +00:00
function TPedidosProveedorController. EsEliminable( APedido: IBizPedidoProveedor) : Boolean ;
begin
if not Assigned( APedido) then
raise Exception. Create ( 'Pedido no asignado: EsEliminable' ) ;
2025-07-23 10:19:05 +00:00
//28/05/25 No se permite modificar pedidos que est<73> n facturados
Result : = ( APedido. SITUACION = SITUACION_PEDIDO_PENDIENTE)
and ( APedido. ID_FACTURAIsNull) ;
2011-11-14 17:40:41 +00:00
end ;
function TPedidosProveedorController. EsModificable( APedido: IBizPedidoProveedor) : Boolean ;
begin
if not Assigned( APedido) then
raise Exception. Create ( 'Pedido no asignado: EsModificable' ) ;
2025-07-23 10:19:05 +00:00
//09/05/25 Stefany nos comunica que necesita poder modificar pedidos aunque est<73> n recibidos
//(APedido.SITUACION <> SITUACION_PEDIDO_RECIBIDO);
Result : = True ;
2011-11-14 17:40:41 +00:00
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<EFBFBD> n en la que estamos en los detalles por que
la asignaci<EFBFBD> n de valores a los campos IMPORTE_NETO e IMPORTE_PORTE
( ver m<EFBFBD> s adelante) colocan el puntero en la tabla detalle al principio.
No he encontrado la raz<EFBFBD> n por la que mueve el puntero. }
ADetallePosAct : = APedido. Detalles. POSICION;
bEnEdicion : = ( APedido. DataTable. State in dsEditModes) ;
if not bEnEdicion then
APedido. Edit;
ShowHourglassCursor;
APedido. Edit;
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 ;
2024-04-19 15:09:52 +00:00
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 los pedidos actuales por fecha
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 ;
2011-11-14 17:40:41 +00:00
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 ;
var
IDNuevo : Integer ;
2024-10-15 19:33:58 +00:00
ABookmark : TBookmark;
ADetallePosAct : Integer ;
2011-11-14 17:40:41 +00:00
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' ) ;
2024-10-16 17:23:58 +00:00
//ESTO DA UN PETE DE COJONES NO GUARDA CABECERA
2024-10-15 19:33:58 +00:00
//Preparamos todo para recuparar la posici<63> n de los detalles para despues de guardar no vaya al principio de los detalles
//OJO en este caso si activamos la desactivaci<63> n de tabla no guarda los importes del pedido
// APedido.DataTable.DisableControls;
// APedido.DataTable.DisableEventHandlers;
2024-10-16 17:23:58 +00:00
// ABookmark := APedido.Detalles.DataTable.GetBookMark;
2024-10-15 19:33:58 +00:00
2011-11-14 17:40:41 +00:00
if ValidarPedido( APedido) then
begin
ShowHourglassCursor;
// Asegurarnos de que todos los importes est<73> n bien.
RecalcularImportes( APedido) ;
try
APedido. DataTable. ApplyUpdates;
2024-10-15 19:33:58 +00:00
2011-11-14 17:40:41 +00:00
Result : = True ;
finally
2024-10-15 19:33:58 +00:00
//Recuparamos la posici<63> n de los detalles para despues de guardar no vaya al principio de los detalles
2024-10-16 17:23:58 +00:00
// APedido.Detalles.DataTable.GotoBookmark(ABookmark);
// APedido.Detalles.DataTable.FreeBookmark(ABookmark);
2024-10-15 19:33:58 +00:00
//OJO en este caso si activamos la desactivaci<63> n de tabla no guarda los importes del pedido
// APedido.DataTable.EnableEventHandlers;
// APedido.DataTable.EnableControls;
2011-11-14 17:40:41 +00:00
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 ;
2022-03-12 10:40:36 +00:00
procedure TPedidosProveedorController. Preview( APedido: IBizPedidoProveedor; AllItems: Boolean = false ; const VerPrecios: Boolean = false ) ;
2011-11-14 17:40:41 +00:00
var
AReportController : IPedidosProveedorReportController;
ID_Pedidos: TStringList;
begin
AReportController : = TPedidosProveedorReportController. Create;
try
ID_Pedidos : = TStringList. Create;
//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( IntToStr( APedido. ID) ) ;
Next;
end ;
end ;
end
//Solo previsualizamos el item seleccionado
else
ID_Pedidos. Add( IntToStr( APedido. ID) ) ;
2022-03-12 10:40:36 +00:00
AReportController. Preview( ID_Pedidos. CommaText, VerPrecios) ;
2011-11-14 17:40:41 +00:00
finally
AReportController : = NIL ;
ID_Pedidos. Free;
end ;
end ;
2022-03-12 10:40:36 +00:00
procedure TPedidosProveedorController. Print( APedido: IBizPedidoProveedor; AllItems: Boolean = false ; const VerPrecios: Boolean = false ) ;
2011-11-14 17:40:41 +00:00
var
AReportController : IPedidosProveedorReportController;
ID_Pedidos: TStringList;
begin
AReportController : = TPedidosProveedorReportController. Create;
try
ID_Pedidos : = TStringList. Create;
//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( IntToStr( APedido. ID) ) ;
Next;
end ;
end ;
end
//Solo previsualizamos el item seleccionado
else
ID_Pedidos. Add( IntToStr( APedido. ID) ) ;
2022-03-12 10:40:36 +00:00
AReportController. Print( ID_Pedidos. CommaText, VerPrecios) ;
2011-11-14 17:40:41 +00:00
finally
AReportController : = NIL ;
ID_Pedidos. Free;
end ;
end ;
function TPedidosProveedorController. GetProveedorController: IProveedoresController;
begin
Result : = FProveedorController;
end ;
function TPedidosProveedorController. GetDetallesController: IDetallesPedidoProveedorController;
begin
Result : = FDetallesController;
end ;
end .