2007-11-16 20:58:56 +00:00
|
|
|
|
unit uFacturasProveedorController;
|
|
|
|
|
|
|
|
|
|
|
|
interface
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uses
|
|
|
|
|
|
Classes, SysUtils, uDADataTable, uControllerBase, uIDataModuleFacturasProveedor,
|
|
|
|
|
|
uProveedoresController, uDetallesFacturaProveedorController, uBizFacturasProveedor,
|
|
|
|
|
|
uBizAlbaranesProveedor;
|
|
|
|
|
|
|
|
|
|
|
|
type
|
2008-08-22 14:52:35 +00:00
|
|
|
|
IFacturasProveedorController = interface(IControllerBase)
|
2007-11-16 20:58:56 +00:00
|
|
|
|
['{3868267C-E61A-4B79-AF61-648B2D627F56}']
|
|
|
|
|
|
function GetProveedorController: IProveedoresController;
|
|
|
|
|
|
procedure SetProveedorController(const Value: IProveedoresController);
|
|
|
|
|
|
property ProveedorController: IProveedoresController read GetProveedorController write SetProveedorController;
|
|
|
|
|
|
|
|
|
|
|
|
function GetDetallesController: IDetallesFacturaProveedorController;
|
|
|
|
|
|
procedure SetDetallesController(const Value: IDetallesFacturaProveedorController);
|
|
|
|
|
|
property DetallesController: IDetallesFacturaProveedorController read GetDetallesController write SetDetallesController;
|
|
|
|
|
|
|
|
|
|
|
|
function Buscar(const ID: Integer): IBizFacturaProveedor;
|
2008-11-10 11:29:57 +00:00
|
|
|
|
function BuscarTodos: IBizFacturaProveedor; overload;
|
|
|
|
|
|
function BuscarTodos(const ID_Proveedor : Integer): IBizFacturaProveedor; overload;
|
2007-11-16 20:58:56 +00:00
|
|
|
|
procedure Ver(AFactura : IBizFacturaProveedor);
|
2008-11-10 11:29:57 +00:00
|
|
|
|
procedure VerTodos(AFacturas: IBizFacturaProveedor;
|
|
|
|
|
|
const AVerModal : Boolean = False; const AWindowCaption: String = '';
|
|
|
|
|
|
const AHeaderText: String = '');
|
2008-01-15 10:41:18 +00:00
|
|
|
|
function Nuevo (withInsert: Boolean = True) : IBizFacturaProveedor;
|
2007-11-16 20:58:56 +00:00
|
|
|
|
function Anadir(AFactura : IBizFacturaProveedor) : Boolean; overload;
|
|
|
|
|
|
function AnadirAbono(AFactura : IBizFacturaProveedor) : Boolean;
|
2008-05-30 17:59:41 +00:00
|
|
|
|
// function Anadir(AFacturas : IBizFacturaProveedor; AListaAlbaranes : IBizAlbaranProveedor): Boolean; overload;
|
2007-11-16 20:58:56 +00:00
|
|
|
|
function Anadir(AFactura : IBizFacturaProveedor; const IDPedido : Integer): Boolean; overload;
|
|
|
|
|
|
|
|
|
|
|
|
function Eliminar(const ID : Integer): Boolean; overload;
|
|
|
|
|
|
function Eliminar(AFactura : IBizFacturaProveedor; AllItems: Boolean = false): Boolean; overload;
|
|
|
|
|
|
function Guardar(AFactura : IBizFacturaProveedor): Boolean;
|
|
|
|
|
|
procedure DescartarCambios(AFactura : IBizFacturaProveedor);
|
|
|
|
|
|
function Existe(const ID: Integer) : Boolean;
|
|
|
|
|
|
procedure RecuperarProveedor(AFactura : IBizFacturaProveedor);
|
|
|
|
|
|
function Duplicar(AFactura: IBizFacturaProveedor): IBizFacturaProveedor;
|
|
|
|
|
|
function GenerarAbono(AFactura: IBizFacturaProveedor): IBizFacturaProveedor;
|
|
|
|
|
|
|
|
|
|
|
|
procedure Preview(AFactura : IBizFacturaProveedor; AllItems: Boolean = false);
|
|
|
|
|
|
procedure Print(AFactura : IBizFacturaProveedor; AllItems: Boolean = false);
|
|
|
|
|
|
|
|
|
|
|
|
procedure RecalcularImportes(FFactura: IBizFacturaProveedor);
|
|
|
|
|
|
function EsModificable(AFactura: IBizFacturaProveedor): Boolean;
|
|
|
|
|
|
function EsEliminable(AFactura: IBizFacturaProveedor): Boolean;
|
|
|
|
|
|
|
|
|
|
|
|
function ElegirFacturas(AFacturas : IBizFacturaProveedor; AMensaje: String; AMultiSelect: Boolean): IBizFacturaProveedor;
|
|
|
|
|
|
function ExtraerSeleccionados(ARecibosProveedor: IBizFacturaProveedor) : IBizFacturaProveedor;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
2008-08-22 14:52:35 +00:00
|
|
|
|
TFacturasProveedorController = class(TControllerBase, IFacturasProveedorController)
|
2007-11-16 20:58:56 +00:00
|
|
|
|
private
|
|
|
|
|
|
FDataModule : IDataModuleFacturasProveedor;
|
|
|
|
|
|
FProveedorController : IProveedoresController;
|
|
|
|
|
|
FDetallesController : IDetallesFacturaProveedorController;
|
|
|
|
|
|
|
|
|
|
|
|
function GetProveedorController: IProveedoresController;
|
|
|
|
|
|
procedure SetProveedorController(const Value: IProveedoresController);
|
|
|
|
|
|
|
|
|
|
|
|
function GetDetallesController: IDetallesFacturaProveedorController;
|
|
|
|
|
|
procedure SetDetallesController(const Value: IDetallesFacturaProveedorController);
|
|
|
|
|
|
|
|
|
|
|
|
function CreateEditor(const AName : String; const IID: TGUID; out Intf): Boolean;
|
|
|
|
|
|
function _Vacio : IBizFacturaProveedor;
|
|
|
|
|
|
|
|
|
|
|
|
procedure FiltrarEmpresa(AFactura: IBizFacturaProveedor);
|
|
|
|
|
|
|
|
|
|
|
|
function ValidarFactura(AFactura: IBizFacturaProveedor): Boolean;
|
|
|
|
|
|
procedure GenerarRecibos(AFactura: IBizFacturaProveedor);
|
|
|
|
|
|
protected
|
|
|
|
|
|
procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); override;
|
|
|
|
|
|
public
|
|
|
|
|
|
property ProveedorController: IProveedoresController read GetProveedorController write SetProveedorController;
|
|
|
|
|
|
property DetallesController: IDetallesFacturaProveedorController read GetDetallesController write SetDetallesController;
|
|
|
|
|
|
|
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(AFactura : IBizFacturaProveedor; AllItems: Boolean = false): Boolean; overload;
|
|
|
|
|
|
function Guardar(AFactura : IBizFacturaProveedor): Boolean;
|
|
|
|
|
|
procedure DescartarCambios(AFactura : IBizFacturaProveedor); virtual;
|
|
|
|
|
|
function Existe(const ID: Integer) : Boolean; virtual;
|
|
|
|
|
|
function Anadir(AFactura : IBizFacturaProveedor) : Boolean; overload;
|
|
|
|
|
|
function AnadirAbono(AFactura : IBizFacturaProveedor) : Boolean;
|
2008-05-30 17:59:41 +00:00
|
|
|
|
// function Anadir(AFacturas : IBizFacturaProveedor; AListaAlbaranes : IBizAlbaranProveedor): Boolean; overload;
|
2007-11-16 20:58:56 +00:00
|
|
|
|
function Anadir(AFactura : IBizFacturaProveedor; const IDPedido : Integer): Boolean; overload;
|
|
|
|
|
|
function Buscar(const ID: Integer): IBizFacturaProveedor;
|
2008-11-10 11:29:57 +00:00
|
|
|
|
function BuscarTodos: IBizFacturaProveedor; overload;
|
|
|
|
|
|
function BuscarTodos(const ID_Proveedor : Integer): IBizFacturaProveedor; overload;
|
2007-11-16 20:58:56 +00:00
|
|
|
|
// function BuscarTodasPendientesComision(IdAgente: Integer; IdComision: Integer; IdFacturasAsociadas: String): IBizFacturaProveedor;
|
2008-01-15 10:41:18 +00:00
|
|
|
|
function Nuevo (withInsert: Boolean = True): IBizFacturaProveedor;
|
2007-11-16 20:58:56 +00:00
|
|
|
|
procedure Ver(AFactura : IBizFacturaProveedor);
|
2008-11-10 11:29:57 +00:00
|
|
|
|
procedure VerTodos(AFacturas: IBizFacturaProveedor;
|
|
|
|
|
|
const AVerModal : Boolean = False; const AWindowCaption: String = '';
|
|
|
|
|
|
const AHeaderText: String = '');
|
2007-11-16 20:58:56 +00:00
|
|
|
|
function Duplicar(AFactura: IBizFacturaProveedor): IBizFacturaProveedor;
|
|
|
|
|
|
function GenerarAbono(AFactura: IBizFacturaProveedor): IBizFacturaProveedor;
|
|
|
|
|
|
procedure RecuperarProveedor(AFactura : IBizFacturaProveedor);
|
|
|
|
|
|
|
|
|
|
|
|
procedure Preview(AFactura : IBizFacturaProveedor; AllItems: Boolean = false);
|
|
|
|
|
|
procedure Print(AFactura : IBizFacturaProveedor; AllItems: Boolean = false);
|
|
|
|
|
|
|
|
|
|
|
|
procedure RecalcularImportes(FFactura: IBizFacturaProveedor);
|
|
|
|
|
|
function EsModificable(AFactura: IBizFacturaProveedor): Boolean;
|
|
|
|
|
|
function EsEliminable(AFactura: IBizFacturaProveedor): Boolean;
|
|
|
|
|
|
|
|
|
|
|
|
function ElegirFacturas(AFacturas : IBizFacturaProveedor; AMensaje: String; AMultiSelect: Boolean): IBizFacturaProveedor;
|
|
|
|
|
|
function ExtraerSeleccionados(AFacturasProveedor: IBizFacturaProveedor) : IBizFacturaProveedor;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
implementation
|
|
|
|
|
|
|
|
|
|
|
|
uses
|
|
|
|
|
|
Windows, Controls, cxControls, DB, uEditorRegistryUtils, schFacturasProveedorClient_Intf,
|
2007-11-18 15:10:09 +00:00
|
|
|
|
uBizContactos, uIEditorFacturasProveedor, uIEditorFacturaProveedor, uFactuGES_App,
|
2007-11-16 20:58:56 +00:00
|
|
|
|
uDataModuleFacturasProveedor, uBizDetallesFacturaProveedor, uControllerDetallesBase,
|
|
|
|
|
|
uDataModuleUsuarios, uDAInterfaces, uDataTableUtils, uDateUtils, uROTypes,
|
|
|
|
|
|
uAlbaranesProveedorController, schAlbaranesProveedorClient_Intf, uDetallesAlbaranProveedorController,
|
2008-05-30 17:59:41 +00:00
|
|
|
|
|
2007-11-16 20:58:56 +00:00
|
|
|
|
uBizPedidosProveedor, uPedidosProveedorController, uBizDetallesPedidoProveedor,
|
2008-09-25 17:28:31 +00:00
|
|
|
|
uRecibosProveedorController, uBizRecibosProveedor, uNumUtils,
|
2007-11-16 20:58:56 +00:00
|
|
|
|
uFacturasProveedorReportController, DateUtils, Forms, Dialogs,
|
2008-11-10 11:29:57 +00:00
|
|
|
|
uFormasPagoController, uBizFormasPago, uStringsUtils;
|
2007-11-16 20:58:56 +00:00
|
|
|
|
|
|
|
|
|
|
procedure CopiarArticulosPedido(AOrigen: IBizDetallesPedidoProveedor;
|
|
|
|
|
|
ADestino : IBizDetallesFacturaProveedor);
|
|
|
|
|
|
var
|
|
|
|
|
|
i : integer;
|
|
|
|
|
|
ADetallesController : IDetallesFacturaProveedorController;
|
|
|
|
|
|
begin
|
|
|
|
|
|
if not Assigned(AOrigen) then
|
|
|
|
|
|
raise Exception.Create ('Origen no asignado (CopiarArticulosPedido)');
|
|
|
|
|
|
|
|
|
|
|
|
if not Assigned(ADestino) then
|
|
|
|
|
|
raise Exception.Create ('Destino no asignado (CopiarArticulosPedido)');
|
|
|
|
|
|
|
|
|
|
|
|
if not AOrigen.DataTable.Active then
|
|
|
|
|
|
AOrigen.DataTable.Active := True;
|
|
|
|
|
|
|
|
|
|
|
|
if not ADestino.DataTable.Active then
|
|
|
|
|
|
ADestino.DataTable.Active := True;
|
|
|
|
|
|
|
|
|
|
|
|
ADetallesController := TDetallesFacturaProveedorController.Create;
|
|
|
|
|
|
try
|
2008-05-26 16:59:17 +00:00
|
|
|
|
//OJO IMPORTANTE
|
|
|
|
|
|
//Siempre que vayamos a trabajar con los detalles debemos hacer un beginupdate de los mismos y un endupdate para
|
|
|
|
|
|
//obligarle siempre a recalcular los detalles una sola vez
|
|
|
|
|
|
ADetallesController.BeginUpdate(ADestino);
|
|
|
|
|
|
|
2007-11-16 20:58:56 +00:00
|
|
|
|
AOrigen.DataTable.First;
|
|
|
|
|
|
for i := 0 to AOrigen.DataTable.RecordCount - 1 do
|
|
|
|
|
|
begin
|
|
|
|
|
|
ADetallesController.Add(ADestino, TIPO_DETALLE_CONCEPTO);
|
|
|
|
|
|
ADestino.Edit;
|
|
|
|
|
|
ADestino.REFERENCIA := AOrigen.REFERENCIA;
|
|
|
|
|
|
if AOrigen.ID_ARTICULO > 0 then
|
|
|
|
|
|
ADestino.ID_ARTICULO := AOrigen.ID_ARTICULO;
|
|
|
|
|
|
ADestino.CONCEPTO := AOrigen.CONCEPTO;
|
|
|
|
|
|
ADestino.CANTIDAD := AOrigen.CANTIDAD;
|
|
|
|
|
|
ADestino.IMPORTE_UNIDAD := AOrigen.IMPORTE_UNIDAD;
|
|
|
|
|
|
ADestino.IMPORTE_TOTAL := AOrigen.IMPORTE_TOTAL;
|
|
|
|
|
|
ADestino.DESCUENTO := AOrigen.DESCUENTO;
|
|
|
|
|
|
ADestino.IMPORTE_PORTE := AOrigen.IMPORTE_PORTE;
|
|
|
|
|
|
ADestino.VISIBLE := AOrigen.VISIBLE;
|
|
|
|
|
|
ADestino.REFERENCIA_PROVEEDOR := AOrigen.REFERENCIA_PROVEEDOR;
|
|
|
|
|
|
ADestino.Post;
|
|
|
|
|
|
AOrigen.Next;
|
|
|
|
|
|
end;
|
|
|
|
|
|
finally
|
2008-05-26 16:59:17 +00:00
|
|
|
|
ADetallesController.EndUpdate(ADestino);
|
2007-11-16 20:58:56 +00:00
|
|
|
|
ADetallesController := NIL;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
{ TFacturasProveedorController }
|
|
|
|
|
|
|
|
|
|
|
|
function TFacturasProveedorController.Anadir(AFactura: IBizFacturaProveedor) : Boolean;
|
|
|
|
|
|
begin
|
|
|
|
|
|
if not Assigned(AFactura) then
|
|
|
|
|
|
raise Exception.Create ('Factura no asignada (Anadir)');
|
|
|
|
|
|
AFactura.Insert;
|
|
|
|
|
|
Result := True;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function TFacturasProveedorController.Anadir(AFactura: IBizFacturaProveedor;
|
|
|
|
|
|
const IDPedido: Integer): Boolean;
|
|
|
|
|
|
var
|
|
|
|
|
|
APedidosController : IPedidosProveedorController;
|
|
|
|
|
|
APedido : IBizPedidoProveedor;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := False;
|
|
|
|
|
|
if not Assigned(AFactura) then
|
|
|
|
|
|
raise Exception.Create ('Factura no asignada (Anadir)');
|
|
|
|
|
|
|
|
|
|
|
|
if (IDPedido < 0) or (IDPedido = 0) then
|
|
|
|
|
|
raise Exception.Create (Format('ID de pedido (%d) incorrecto (Anadir)', [IDPedido]));
|
|
|
|
|
|
|
|
|
|
|
|
if not AFactura.DataTable.Active then
|
|
|
|
|
|
AFactura.DataTable.Active := True;
|
|
|
|
|
|
|
|
|
|
|
|
ShowHourglassCursor;
|
|
|
|
|
|
Application.ProcessMessages;
|
|
|
|
|
|
|
|
|
|
|
|
APedido := NIL;
|
|
|
|
|
|
APedidosController := TPedidosProveedorController.Create;
|
|
|
|
|
|
try
|
|
|
|
|
|
APedido := APedidosController.Buscar(IDPedido);
|
|
|
|
|
|
|
|
|
|
|
|
if not Assigned(APedido) then
|
|
|
|
|
|
raise Exception.Create (Format('No se ha encontrado un pedido de Proveedor con ID %d (Anadir)', [IDPedido]));
|
|
|
|
|
|
|
|
|
|
|
|
APedido.DataTable.Active := True;
|
|
|
|
|
|
APedidosController.RecuperarProveedor(APedido);
|
|
|
|
|
|
|
|
|
|
|
|
Self.Anadir(AFactura);
|
|
|
|
|
|
AFactura.Proveedor := APedido.Proveedor;
|
|
|
|
|
|
|
|
|
|
|
|
CopiarArticulosPedido(APedido.Detalles, AFactura.Detalles);
|
|
|
|
|
|
|
|
|
|
|
|
// Guardo la factura que acabo de generar
|
|
|
|
|
|
AFactura.CalcularImporteTotal;
|
|
|
|
|
|
Self.Guardar(AFactura);
|
|
|
|
|
|
|
|
|
|
|
|
Result := True;
|
|
|
|
|
|
finally
|
|
|
|
|
|
APedido := NIL;
|
|
|
|
|
|
APedidosController := NIL;
|
|
|
|
|
|
HideHourglassCursor;
|
|
|
|
|
|
Application.ProcessMessages;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TFacturasProveedorController.AnadirAbono(AFactura: IBizFacturaProveedor): Boolean;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := Anadir(AFactura);
|
|
|
|
|
|
AFactura.TIPO := CTE_TIPO_ABONO;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TFacturasProveedorController.Buscar(const ID: Integer): IBizFacturaProveedor;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := (FDataModule as IDataModuleFacturasProveedor).GetItem(ID);
|
|
|
|
|
|
FiltrarEmpresa(Result);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
2008-11-10 11:29:57 +00:00
|
|
|
|
function TFacturasProveedorController.BuscarTodos(
|
|
|
|
|
|
const ID_Proveedor: Integer): IBizFacturaProveedor;
|
|
|
|
|
|
var
|
|
|
|
|
|
Condicion: TDAWhereExpression;
|
|
|
|
|
|
begin
|
|
|
|
|
|
ShowHourglassCursor;
|
|
|
|
|
|
try
|
|
|
|
|
|
Result := BuscarTodos;
|
|
|
|
|
|
|
|
|
|
|
|
with Result.DataTable.DynamicWhere do
|
|
|
|
|
|
begin
|
|
|
|
|
|
// ID_CLIENTE
|
|
|
|
|
|
Condicion := NewBinaryExpression(NewField('', fld_FacturasProveedorID_PROVEEDOR),
|
|
|
|
|
|
NewConstant(ID_Proveedor, datInteger), dboEqual);
|
|
|
|
|
|
|
|
|
|
|
|
if IsEmpty then
|
|
|
|
|
|
Expression := Condicion
|
|
|
|
|
|
else
|
|
|
|
|
|
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
|
|
|
|
|
|
end;
|
|
|
|
|
|
finally
|
|
|
|
|
|
HideHourglassCursor;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
2007-11-18 17:23:37 +00:00
|
|
|
|
{REPASARRRRR
|
2007-11-16 20:58:56 +00:00
|
|
|
|
function TFacturasProveedorController.BuscarTodasPendientesComision(IdAgente:Integer; IdComision: Integer; IdFacturasAsociadas: String): IBizFacturaProveedor;
|
|
|
|
|
|
begin
|
|
|
|
|
|
ShowHourglassCursor;
|
|
|
|
|
|
try
|
|
|
|
|
|
Result := BuscarTodos;
|
|
|
|
|
|
with Result.DataTable.Where do
|
|
|
|
|
|
begin
|
|
|
|
|
|
if NotEmpty then
|
|
|
|
|
|
AddOperator(opAND);
|
|
|
|
|
|
//Todas las facturas de un agente determinado
|
|
|
|
|
|
OpenBraket;
|
|
|
|
|
|
AddText(fld_FacturasProveedorID_AGENTE + ' = ' + IntToStr(IdAgente));
|
|
|
|
|
|
CloseBraket;
|
|
|
|
|
|
|
|
|
|
|
|
//Todas aquellas que no esten asociadas a ninguna comisi<73>n o asociadas a la comisi<73>n,
|
|
|
|
|
|
//pero no asociadas en el editor de la comision, esto es porque se puede agregar y quitar
|
|
|
|
|
|
//facturas y todos los cambios estan el cache y por lo tanto al pedir las facturas a seleccionar
|
|
|
|
|
|
//debemos tener en cuenta dichso cambios en cache
|
|
|
|
|
|
AddOperator(opAND);
|
|
|
|
|
|
OpenBraket;
|
|
|
|
|
|
OpenBraket;
|
|
|
|
|
|
//En el caso de ser facturas sin asociar
|
|
|
|
|
|
OpenBraket;
|
|
|
|
|
|
AddText(fld_FacturasProveedorID_COMISION_LIQUIDADA + ' IS NULL ');
|
|
|
|
|
|
CloseBraket;
|
|
|
|
|
|
//Quitamos aquellas que ya est<73>n asociadas
|
|
|
|
|
|
if length(IdFacturasAsociadas) > 0 then
|
|
|
|
|
|
begin
|
|
|
|
|
|
AddOperator(opAND);
|
|
|
|
|
|
OpenBraket;
|
|
|
|
|
|
AddText(fld_FacturasProveedorID + ' not in (' + IdFacturasAsociadas + ')');
|
|
|
|
|
|
CloseBraket;
|
|
|
|
|
|
end;
|
|
|
|
|
|
CloseBraket;
|
|
|
|
|
|
|
|
|
|
|
|
AddOperator(opOR);
|
|
|
|
|
|
|
|
|
|
|
|
OpenBraket;
|
|
|
|
|
|
//En caso de ser facturas ya asociadas lo limitamos a la comision actual
|
|
|
|
|
|
//ya que no debemos poder elegir facturas asociadas a otras comisiones
|
|
|
|
|
|
OpenBraket;
|
|
|
|
|
|
AddText(fld_FacturasProveedorID_COMISION_LIQUIDADA + ' = ' + IntToStr(IdComision));
|
|
|
|
|
|
CloseBraket;
|
|
|
|
|
|
//En el caso de que halla facturas asociadas
|
|
|
|
|
|
if length(IdFacturasAsociadas) > 0 then
|
|
|
|
|
|
begin
|
|
|
|
|
|
AddOperator(opAND);
|
|
|
|
|
|
OpenBraket;
|
|
|
|
|
|
AddText(fld_FacturasProveedorID + ' not in (' + IdFacturasAsociadas + ')');
|
|
|
|
|
|
CloseBraket;
|
|
|
|
|
|
end;
|
|
|
|
|
|
CloseBraket;
|
|
|
|
|
|
|
|
|
|
|
|
CloseBraket;
|
|
|
|
|
|
end;
|
|
|
|
|
|
finally
|
|
|
|
|
|
HideHourglassCursor;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function TFacturasProveedorController.BuscarTodos: IBizFacturaProveedor;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := FDataModule.GetItems;
|
|
|
|
|
|
FiltrarEmpresa(Result);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
constructor TFacturasProveedorController.Create;
|
|
|
|
|
|
begin
|
2007-11-22 19:09:07 +00:00
|
|
|
|
inherited;
|
2007-11-16 20:58:56 +00:00
|
|
|
|
FDataModule := TDataModuleFacturasProveedor.Create(Nil);
|
|
|
|
|
|
FProveedorController := TProveedoresController.Create;
|
|
|
|
|
|
FDetallesController := TDetallesFacturaProveedorController.Create;
|
|
|
|
|
|
FDetallesController.addObservador(Self);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TFacturasProveedorController.CreateEditor(const AName: String;
|
|
|
|
|
|
const IID: TGUID; out Intf): Boolean;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := Supports(EditorRegistry.CreateEditor(AName), IID, Intf);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TFacturasProveedorController.DescartarCambios(AFactura: IBizFacturaProveedor);
|
|
|
|
|
|
begin
|
|
|
|
|
|
if not Assigned(AFactura) then
|
|
|
|
|
|
raise Exception.Create ('Factura no asignada');
|
|
|
|
|
|
|
|
|
|
|
|
ShowHourglassCursor;
|
|
|
|
|
|
try
|
|
|
|
|
|
if (AFactura.State in dsEditModes) then
|
|
|
|
|
|
AFactura.Cancel;
|
|
|
|
|
|
|
|
|
|
|
|
AFactura.DataTable.CancelUpdates;
|
|
|
|
|
|
finally
|
|
|
|
|
|
HideHourglassCursor;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
destructor TFacturasProveedorController.Destroy;
|
|
|
|
|
|
begin
|
|
|
|
|
|
FDataModule := Nil;
|
|
|
|
|
|
FProveedorController := Nil;
|
|
|
|
|
|
FDetallesController := Nil;
|
|
|
|
|
|
inherited;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TFacturasProveedorController.Duplicar(AFactura: IBizFacturaProveedor): IBizFacturaProveedor;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := Self._Vacio;
|
|
|
|
|
|
ShowHourglassCursor;
|
|
|
|
|
|
try
|
|
|
|
|
|
DuplicarRegistros(AFactura.DataTable, Result.DataTable, mdrActual);
|
|
|
|
|
|
DuplicarRegistros(AFactura.Detalles.DataTable, Result.Detalles.DataTable, mdrTodos);
|
|
|
|
|
|
|
|
|
|
|
|
// Hay que dejar algunos campos como si fuera una factura nueva
|
|
|
|
|
|
Result.Edit;
|
|
|
|
|
|
with Result do
|
|
|
|
|
|
begin
|
2007-11-18 15:10:09 +00:00
|
|
|
|
ID_EMPRESA := AppFactuGES.EmpresaActiva.ID;
|
|
|
|
|
|
USUARIO := AppFactuGES.UsuarioActivo.UserName;
|
2007-11-16 20:58:56 +00:00
|
|
|
|
REFERENCIA := ''; //Para que se asigne una nueva
|
|
|
|
|
|
SITUACION := CTE_PENDIENTE; //Una factura nueva debe estar pendiente
|
|
|
|
|
|
FECHA_FACTURA := DateOf(Now);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
Result.Post;
|
|
|
|
|
|
finally
|
|
|
|
|
|
HideHourglassCursor;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TFacturasProveedorController.ValidarFactura(AFactura: IBizFacturaProveedor): Boolean;
|
|
|
|
|
|
begin
|
2008-07-31 09:15:14 +00:00
|
|
|
|
Result := False;
|
|
|
|
|
|
|
2007-11-16 20:58:56 +00:00
|
|
|
|
if not Assigned(AFactura) then
|
|
|
|
|
|
raise Exception.Create ('Factura no asignada');
|
|
|
|
|
|
|
|
|
|
|
|
if (AFactura.DataTable.State in dsEditModes) then
|
|
|
|
|
|
AFactura.DataTable.Post;
|
|
|
|
|
|
|
|
|
|
|
|
//Tambien hacemos post de sus tablas hija
|
|
|
|
|
|
if (AFactura.Detalles.DataTable.State in dsEditModes) then
|
|
|
|
|
|
AFactura.Detalles.DataTable.Post;
|
|
|
|
|
|
|
|
|
|
|
|
if (AFactura.ID_PROVEEDOR < 0) or (AFactura.ID_PROVEEDOR = 0) then
|
|
|
|
|
|
// No comprobar el objeto Proveedor por que puede fallar la validaci<63>n
|
|
|
|
|
|
// cuando se generan facturas autom<6F>ticamente.
|
|
|
|
|
|
{ (not Assigned(AFactura.Proveedor)) or
|
|
|
|
|
|
(AFactura.Proveedor.IsEmpty) then}
|
|
|
|
|
|
raise Exception.Create('Debe indicar el Proveedor de esta factura');
|
|
|
|
|
|
|
|
|
|
|
|
if (EsFechaVacia(AFactura.FECHA_FACTURA)) then
|
|
|
|
|
|
raise Exception.Create('Debe indicar la fecha de esta factura');
|
|
|
|
|
|
|
|
|
|
|
|
if (AFactura.Detalles.DataTable.RecordCount = 0) then
|
|
|
|
|
|
raise Exception.Create('La factura debe tener al menos un concepto en su contenido');
|
|
|
|
|
|
|
|
|
|
|
|
{ Esta validaci<EFBFBD>n puede saltar cuando se generan facturas autom<EFBFBD>ticamente
|
|
|
|
|
|
por albaranes o pedidos y el Proveedor no tiene Tipo de IVA puesto. }
|
|
|
|
|
|
{ if (AFactura.ID_TIPO_IVA = 0) then
|
|
|
|
|
|
raise Exception.Create('Debe indicar un tipo de IVA para esta factura');}
|
|
|
|
|
|
|
|
|
|
|
|
//En caso de ser un Abono no podra tener un importe total positivo
|
|
|
|
|
|
if (AFactura.TIPO = CTE_TIPO_ABONO) then
|
|
|
|
|
|
if (AFactura.IMPORTE_TOTAL >= 0) then
|
|
|
|
|
|
raise Exception.Create('Un abono nunca no puede tener un importe positivo');
|
|
|
|
|
|
|
|
|
|
|
|
{ Asegurarse de valores en campos "autom<6F>ticos" tanto
|
|
|
|
|
|
en MODIFICACI<EFBFBD>N como en INSERCI<EFBFBD>N. }
|
|
|
|
|
|
AFactura.Edit;
|
|
|
|
|
|
try
|
2007-11-18 15:10:09 +00:00
|
|
|
|
AFactura.USUARIO := AppFactuGES.UsuarioActivo.UserName;
|
2007-11-16 20:58:56 +00:00
|
|
|
|
|
|
|
|
|
|
if Assigned(AFactura.Proveedor)
|
|
|
|
|
|
and (AFactura.ID_Proveedor <> AFactura.Proveedor.ID) then
|
|
|
|
|
|
AFactura.ID_Proveedor := AFactura.Proveedor.ID;
|
|
|
|
|
|
|
|
|
|
|
|
Result := True;
|
|
|
|
|
|
finally
|
|
|
|
|
|
AFactura.Post;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TFacturasProveedorController.Ver(AFactura: IBizFacturaProveedor);
|
|
|
|
|
|
var
|
|
|
|
|
|
AEditor : IEditorFacturaProveedor;
|
|
|
|
|
|
begin
|
|
|
|
|
|
AEditor := NIL;
|
|
|
|
|
|
|
2008-11-11 16:22:18 +00:00
|
|
|
|
RecuperarProveedor(AFactura);
|
|
|
|
|
|
CreateEditor('EditorFacturaProveedor', IEditorFacturaProveedor, AEditor);
|
|
|
|
|
|
|
|
|
|
|
|
if Assigned(AEditor) then
|
2008-11-13 13:10:32 +00:00
|
|
|
|
try
|
|
|
|
|
|
AEditor.Controller := Self; //OJO ORDEN MUY IMPORTANTE
|
|
|
|
|
|
AEditor.Factura := AFactura;
|
2007-11-16 20:58:56 +00:00
|
|
|
|
|
2008-11-13 13:10:32 +00:00
|
|
|
|
//MODO CONSULTAR
|
|
|
|
|
|
if not EsModificable(AFactura) then
|
|
|
|
|
|
begin
|
|
|
|
|
|
SetDataTableReadOnly(AFactura.DataTable, True);
|
|
|
|
|
|
AEditor.ReadOnly := True;
|
|
|
|
|
|
end;
|
2007-11-16 20:58:56 +00:00
|
|
|
|
|
2008-11-13 13:10:32 +00:00
|
|
|
|
AEditor.ShowModal;
|
2007-11-16 20:58:56 +00:00
|
|
|
|
|
2008-11-13 13:10:32 +00:00
|
|
|
|
//MODO CONSULTAR (Se deja la tabla como estaba)
|
|
|
|
|
|
if AEditor.ReadOnly then
|
|
|
|
|
|
SetDataTableReadOnly(AFactura.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;
|
|
|
|
|
|
|
2008-11-10 11:29:57 +00:00
|
|
|
|
procedure TFacturasProveedorController.VerTodos(AFacturas: IBizFacturaProveedor;
|
|
|
|
|
|
const AVerModal : Boolean = False; const AWindowCaption: String = '';
|
|
|
|
|
|
const AHeaderText: String = '');
|
2007-11-16 20:58:56 +00:00
|
|
|
|
var
|
|
|
|
|
|
AEditor : IEditorFacturasProveedor;
|
|
|
|
|
|
begin
|
|
|
|
|
|
AEditor := NIL;
|
2008-11-10 11:29:57 +00:00
|
|
|
|
|
2008-11-11 16:22:18 +00:00
|
|
|
|
CreateEditor('EditorFacturasProveedor', IEditorFacturasProveedor, AEditor);
|
2008-11-13 13:10:32 +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.Facturas := AFacturas;
|
|
|
|
|
|
AEditor.MultiSelect := True;
|
|
|
|
|
|
if AVerModal then
|
|
|
|
|
|
AEditor.ShowModal
|
|
|
|
|
|
else
|
|
|
|
|
|
AEditor.ShowEmbedded;
|
|
|
|
|
|
finally
|
|
|
|
|
|
if AVerModal then
|
|
|
|
|
|
AEditor.Release;
|
|
|
|
|
|
AEditor := Nil;
|
2007-11-16 20:58:56 +00:00
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TFacturasProveedorController._Vacio: IBizFacturaProveedor;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := Buscar(ID_NULO);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TFacturasProveedorController.Eliminar(const ID: Integer): Boolean;
|
|
|
|
|
|
var
|
|
|
|
|
|
AFactura : IBizFacturaProveedor;
|
|
|
|
|
|
begin
|
|
|
|
|
|
AFactura := Buscar(ID);
|
|
|
|
|
|
|
|
|
|
|
|
if not Assigned(AFactura) then
|
|
|
|
|
|
raise Exception.Create(Format('No se ha encontrado la factura con ID = %d', [ID]));
|
|
|
|
|
|
|
|
|
|
|
|
Result := Eliminar(AFactura);
|
|
|
|
|
|
AFactura := NIL;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TFacturasProveedorController.ElegirFacturas(AFacturas: IBizFacturaProveedor; AMensaje: String;
|
|
|
|
|
|
AMultiSelect: Boolean): IBizFacturaProveedor;
|
|
|
|
|
|
{var
|
|
|
|
|
|
AEditor : IEditorElegirFacturasProveedor;}
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := NIL;
|
2007-11-18 20:08:55 +00:00
|
|
|
|
{
|
|
|
|
|
|
CreateEditor('EditorElegirFacturasProveedor', IEditorElegirFacturasProveedor, AEditor);
|
|
|
|
|
|
if Assigned(AEditor) then
|
|
|
|
|
|
with AEditor do
|
|
|
|
|
|
begin
|
2008-11-11 16:22:18 +00:00
|
|
|
|
try
|
|
|
|
|
|
Controller := Self;
|
|
|
|
|
|
Facturas := AFacturas;
|
|
|
|
|
|
MultiSelect := AMultiSelect;
|
|
|
|
|
|
Mensaje := AMensaje;
|
|
|
|
|
|
if IsPositiveResult(ShowModal) then
|
|
|
|
|
|
Result := FacturasProveedoreSeleccionados;
|
|
|
|
|
|
finally
|
2008-11-13 13:10:32 +00:00
|
|
|
|
AEditor.Release;
|
2008-11-11 16:22:18 +00:00
|
|
|
|
AEditor := NIL;
|
|
|
|
|
|
end;
|
2007-11-18 20:08:55 +00:00
|
|
|
|
end;
|
2007-11-16 20:58:56 +00:00
|
|
|
|
}
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TFacturasProveedorController.Eliminar(AFactura: IBizFacturaProveedor; 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(AFactura) then
|
|
|
|
|
|
raise Exception.Create ('Factura no asignada');
|
|
|
|
|
|
|
|
|
|
|
|
ShowHourglassCursor;
|
|
|
|
|
|
try
|
|
|
|
|
|
if not AFactura.DataTable.Active then
|
|
|
|
|
|
AFactura.DataTable.Active := True;
|
|
|
|
|
|
|
|
|
|
|
|
if (AFactura.State in dsEditModes) then
|
|
|
|
|
|
AFactura.Cancel;
|
|
|
|
|
|
|
|
|
|
|
|
//Siempre eliminaremos el seleccionado
|
|
|
|
|
|
if EsEliminable(AFactura) then
|
|
|
|
|
|
begin
|
|
|
|
|
|
AFactura.Delete;
|
|
|
|
|
|
bEliminado := True;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
//En el caso de querer eliminar todos los items del objeto AAlbaran
|
|
|
|
|
|
if AllItems then
|
|
|
|
|
|
begin
|
|
|
|
|
|
with AFactura.DataTable do
|
|
|
|
|
|
begin
|
|
|
|
|
|
First;
|
|
|
|
|
|
while not EOF do
|
|
|
|
|
|
begin
|
|
|
|
|
|
if EsEliminable(AFactura) then
|
|
|
|
|
|
begin
|
|
|
|
|
|
AFactura.Delete;
|
|
|
|
|
|
bEliminado := True
|
|
|
|
|
|
end
|
|
|
|
|
|
else Next;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
if bEliminado then
|
|
|
|
|
|
begin
|
2008-09-19 09:50:21 +00:00
|
|
|
|
try
|
|
|
|
|
|
AFactura.DataTable.ApplyUpdates;
|
|
|
|
|
|
Result := True
|
|
|
|
|
|
except
|
|
|
|
|
|
//En el caso de una factura que tiene recibos con devoluciones hechas no se puede borrar aunque la factura este en situacion de pendiente
|
|
|
|
|
|
AFactura.DataTable.CancelUpdates;
|
|
|
|
|
|
Result := False;
|
|
|
|
|
|
end;
|
2007-11-16 20:58:56 +00:00
|
|
|
|
end
|
|
|
|
|
|
else
|
|
|
|
|
|
Result := False;
|
|
|
|
|
|
|
|
|
|
|
|
finally
|
|
|
|
|
|
HideHourglassCursor;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TFacturasProveedorController.EsEliminable(AFactura: IBizFacturaProveedor): Boolean;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := EsModificable(AFactura);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TFacturasProveedorController.EsModificable(AFactura: IBizFacturaProveedor): Boolean;
|
|
|
|
|
|
begin
|
|
|
|
|
|
if not Assigned(AFactura) then
|
|
|
|
|
|
raise Exception.Create ('Factura no asignado: EsModificable');
|
|
|
|
|
|
|
|
|
|
|
|
Result := (AFactura.SITUACION = CTE_PENDIENTE);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TFacturasProveedorController.RecalcularImportes(
|
|
|
|
|
|
FFactura: IBizFacturaProveedor);
|
|
|
|
|
|
var
|
|
|
|
|
|
bEnEdicion : Boolean;
|
2007-12-20 21:07:01 +00:00
|
|
|
|
ADetallePosAct : Integer;
|
2007-11-16 20:58:56 +00:00
|
|
|
|
begin
|
|
|
|
|
|
if not Assigned(FFactura) then
|
|
|
|
|
|
raise Exception.Create ('Factura no asignada (RecalcularImportes)');
|
|
|
|
|
|
|
|
|
|
|
|
if FFactura.DataTable.Active then
|
|
|
|
|
|
FFactura.DataTable.Active := True;
|
|
|
|
|
|
|
2007-12-20 21:07:01 +00:00
|
|
|
|
{ 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 := FFactura.Detalles.POSICION;
|
|
|
|
|
|
|
2007-11-16 20:58:56 +00:00
|
|
|
|
bEnEdicion := (FFactura.DataTable.State in dsEditModes);
|
|
|
|
|
|
if not bEnEdicion then
|
|
|
|
|
|
FFactura.Edit;
|
|
|
|
|
|
|
|
|
|
|
|
ShowHourglassCursor;
|
|
|
|
|
|
try
|
|
|
|
|
|
FFactura.IMPORTE_NETO := FDetallesController.DarTotalImporteTotal(FFactura.Detalles);
|
|
|
|
|
|
FFactura.IMPORTE_PORTE := FDetallesController.DarTotalPorteTotal(FFactura.Detalles);
|
|
|
|
|
|
if not bEnEdicion then
|
|
|
|
|
|
FFactura.Post;
|
|
|
|
|
|
finally
|
|
|
|
|
|
HideHourglassCursor;
|
2007-12-20 21:07:01 +00:00
|
|
|
|
// Restaurar la posici<63>n que ten<65>amos en los detalles.
|
|
|
|
|
|
FDetallesController.LocalizarPosicion(FFactura.Detalles, ADetallePosAct);
|
2007-11-16 20:58:56 +00:00
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TFacturasProveedorController.RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable);
|
|
|
|
|
|
var
|
|
|
|
|
|
AFactura : IBizFacturaProveedor;
|
|
|
|
|
|
ADetalles : IBizDetallesFacturaProveedor;
|
|
|
|
|
|
begin
|
|
|
|
|
|
inherited;
|
|
|
|
|
|
|
|
|
|
|
|
if Supports(ADataTable, IBizDetallesFacturaProveedor, ADetalles) and
|
|
|
|
|
|
Supports(ADetalles.DataTable.MasterSource.DataTable, IBizFacturaProveedor, AFactura) then
|
|
|
|
|
|
begin
|
|
|
|
|
|
RecalcularImportes(AFactura);
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TFacturasProveedorController.RecuperarProveedor(AFactura: IBizFacturaProveedor);
|
|
|
|
|
|
begin
|
|
|
|
|
|
AFactura._Proveedor := (FProveedorController.Buscar(AFactura.ID_Proveedor) as IBizProveedor);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TFacturasProveedorController.Existe(const ID: Integer): Boolean;
|
|
|
|
|
|
var
|
|
|
|
|
|
AFactura : IBizFacturaProveedor;
|
|
|
|
|
|
begin
|
|
|
|
|
|
try
|
|
|
|
|
|
AFactura := Buscar(ID);
|
|
|
|
|
|
Result := Assigned(AFactura) and (AFactura.ID = ID);
|
|
|
|
|
|
finally
|
|
|
|
|
|
AFactura := NIL;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TFacturasProveedorController.ExtraerSeleccionados(AFacturasProveedor: IBizFacturaProveedor): IBizFacturaProveedor;
|
|
|
|
|
|
var
|
|
|
|
|
|
ASeleccionados : IBizFacturaProveedor;
|
|
|
|
|
|
begin
|
|
|
|
|
|
ASeleccionados := (Self.Buscar(ID_NULO) as IBizFacturaProveedor);
|
2008-05-21 15:15:41 +00:00
|
|
|
|
CopyDataTableDA5(AFacturasProveedor.DataTable, ASeleccionados.DataTable, True);
|
2007-11-16 20:58:56 +00:00
|
|
|
|
Result := ASeleccionados;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TFacturasProveedorController.FiltrarEmpresa(AFactura: IBizFacturaProveedor);
|
2007-11-18 17:23:37 +00:00
|
|
|
|
var
|
|
|
|
|
|
Condicion: TDAWhereExpression;
|
2007-11-16 20:58:56 +00:00
|
|
|
|
begin
|
|
|
|
|
|
if AFactura.DataTable.Active then
|
|
|
|
|
|
AFactura.DataTable.Active := False;
|
|
|
|
|
|
|
|
|
|
|
|
// Filtrar las facturas actuales por empresa
|
2007-11-18 17:23:37 +00:00
|
|
|
|
with AFactura.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_FacturasProveedorID_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;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TFacturasProveedorController.SetProveedorController(const Value: IProveedoresController);
|
|
|
|
|
|
begin
|
|
|
|
|
|
FProveedorController := Value;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TFacturasProveedorController.SetDetallesController(const Value: IDetallesFacturaProveedorController);
|
|
|
|
|
|
begin
|
|
|
|
|
|
FDetallesController := Value;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TFacturasProveedorController.Guardar(AFactura: IBizFacturaProveedor): Boolean;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := False;
|
|
|
|
|
|
|
|
|
|
|
|
if not Assigned(AFactura) then
|
|
|
|
|
|
raise Exception.Create ('Factura no asignada');
|
|
|
|
|
|
|
|
|
|
|
|
if not Assigned(FDetallesController) then
|
|
|
|
|
|
raise Exception.Create ('Controller detalles no asignado');
|
|
|
|
|
|
|
|
|
|
|
|
if ValidarFactura(AFactura) then
|
|
|
|
|
|
begin
|
|
|
|
|
|
ShowHourglassCursor;
|
|
|
|
|
|
|
|
|
|
|
|
// Asegurarnos de que todos los importes est<73>n bien.
|
|
|
|
|
|
RecalcularImportes(AFactura);
|
|
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
|
AFactura.DataTable.ApplyUpdates;
|
|
|
|
|
|
|
|
|
|
|
|
//Se generan los recibos autom<6F>ticamente a partir de la forma de pago
|
|
|
|
|
|
GenerarRecibos(AFactura);
|
|
|
|
|
|
|
|
|
|
|
|
Result := True;
|
|
|
|
|
|
finally
|
|
|
|
|
|
HideHourglassCursor;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
2008-01-15 10:41:18 +00:00
|
|
|
|
function TFacturasProveedorController.Nuevo(withInsert: Boolean = True): IBizFacturaProveedor;
|
2007-11-16 20:58:56 +00:00
|
|
|
|
var
|
|
|
|
|
|
AFactura : IBizFacturaProveedor;
|
|
|
|
|
|
begin
|
|
|
|
|
|
AFactura := FDataModule.NewItem;
|
|
|
|
|
|
FiltrarEmpresa(AFactura);
|
|
|
|
|
|
AFactura.DataTable.Active := True;
|
2008-01-15 10:41:18 +00:00
|
|
|
|
if withInsert then
|
|
|
|
|
|
AFactura.Insert;
|
2007-11-16 20:58:56 +00:00
|
|
|
|
Result := AFactura;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TFacturasProveedorController.Preview(AFactura: IBizFacturaProveedor; AllItems: Boolean = false);
|
|
|
|
|
|
var
|
|
|
|
|
|
AReportController : IFacturasProveedorReportController;
|
|
|
|
|
|
ID_Facturas: TStringList;
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
|
|
AReportController := TFacturasProveedorReportController.Create;
|
|
|
|
|
|
try
|
|
|
|
|
|
ID_Facturas := TStringList.Create;
|
|
|
|
|
|
|
|
|
|
|
|
//Si deseamos previsualizar todos los items del objeto albaran
|
|
|
|
|
|
if AllItems then
|
|
|
|
|
|
begin
|
|
|
|
|
|
with AFactura.DataTable do
|
|
|
|
|
|
begin
|
|
|
|
|
|
First;
|
|
|
|
|
|
while not EOF do
|
|
|
|
|
|
begin
|
|
|
|
|
|
ID_Facturas.Add(IntToStr(AFactura.ID));
|
|
|
|
|
|
Next;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end
|
|
|
|
|
|
//Solo previsualizamos el item seleccionado
|
|
|
|
|
|
else
|
|
|
|
|
|
ID_Facturas.Add(IntToStr(AFactura.ID));
|
|
|
|
|
|
|
|
|
|
|
|
AReportController.Preview(ID_Facturas.CommaText);
|
|
|
|
|
|
|
|
|
|
|
|
finally
|
|
|
|
|
|
AReportController := NIL;
|
2007-11-17 21:39:22 +00:00
|
|
|
|
FreeANDNIL(ID_Facturas);
|
2007-11-16 20:58:56 +00:00
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TFacturasProveedorController.Print(AFactura: IBizFacturaProveedor; AllItems: Boolean = false);
|
|
|
|
|
|
var
|
|
|
|
|
|
AReportController : IFacturasProveedorReportController;
|
|
|
|
|
|
ID_Facturas: TStringList;
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
|
|
AReportController := TFacturasProveedorReportController.Create;
|
|
|
|
|
|
try
|
|
|
|
|
|
ID_Facturas := TStringList.Create;
|
|
|
|
|
|
|
|
|
|
|
|
//Si deseamos previsualizar todos los items del objeto albaran
|
|
|
|
|
|
if AllItems then
|
|
|
|
|
|
begin
|
|
|
|
|
|
with AFactura.DataTable do
|
|
|
|
|
|
begin
|
|
|
|
|
|
First;
|
|
|
|
|
|
while not EOF do
|
|
|
|
|
|
begin
|
|
|
|
|
|
ID_Facturas.Add(IntToStr(AFactura.ID));
|
|
|
|
|
|
Next;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end
|
|
|
|
|
|
//Solo previsualizamos el item seleccionado
|
|
|
|
|
|
else
|
|
|
|
|
|
ID_Facturas.Add(IntToStr(AFactura.ID));
|
|
|
|
|
|
|
|
|
|
|
|
AReportController.Print(ID_Facturas.CommaText);
|
|
|
|
|
|
|
|
|
|
|
|
finally
|
|
|
|
|
|
AReportController := NIL;
|
2007-11-17 21:39:22 +00:00
|
|
|
|
FreeANDNIL(ID_Facturas);
|
2007-11-16 20:58:56 +00:00
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TFacturasProveedorController.GenerarAbono(AFactura: IBizFacturaProveedor): IBizFacturaProveedor;
|
|
|
|
|
|
begin
|
|
|
|
|
|
ShowHourglassCursor;
|
|
|
|
|
|
try
|
|
|
|
|
|
Result := Duplicar(AFactura);
|
|
|
|
|
|
//A<>ade un concepto con los datos de la factura asociada al abono
|
|
|
|
|
|
FDetallesController.AnadirDetalleFacturaAsociadaAbono(Result.Detalles, AFactura.REFERENCIA, DateToStr(AFactura.FECHA_FACTURA));
|
|
|
|
|
|
//Convierte todos los articulos de la factura a negativos por se un abono
|
|
|
|
|
|
FDetallesController.CambiarSignoDetalles(Result.Detalles);
|
|
|
|
|
|
|
|
|
|
|
|
// Hay que dejar algunos campos como si fuera una factura nueva
|
|
|
|
|
|
Result.Edit;
|
|
|
|
|
|
Result.TIPO := CTE_TIPO_ABONO;
|
|
|
|
|
|
Result.Post;
|
|
|
|
|
|
|
|
|
|
|
|
finally
|
|
|
|
|
|
HideHourglassCursor;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TFacturasProveedorController.GenerarRecibos(AFactura: IBizFacturaProveedor);
|
|
|
|
|
|
var
|
|
|
|
|
|
AFormasPagoController : IFormasPagoController;
|
|
|
|
|
|
AFormaPago: IBizFormaPago;
|
|
|
|
|
|
ARecibosProveedorController: IRecibosProveedorController;
|
|
|
|
|
|
ARecibos: IBizRecibosProveedor;
|
2008-09-25 17:28:31 +00:00
|
|
|
|
AFechaVencimiento: TDateTime;
|
2007-11-16 20:58:56 +00:00
|
|
|
|
i: Integer;
|
2008-09-25 17:28:31 +00:00
|
|
|
|
ADiaVencimiento: Integer;
|
|
|
|
|
|
ADiasMas: Integer;
|
|
|
|
|
|
|
2007-11-16 20:58:56 +00:00
|
|
|
|
begin
|
|
|
|
|
|
|
|
|
|
|
|
if not Assigned(AFactura) then
|
|
|
|
|
|
Exit;
|
|
|
|
|
|
|
|
|
|
|
|
AFormasPagoController := TFormasPagoController.Create;
|
|
|
|
|
|
AFormaPago := AFormasPagoController.Buscar(AFactura.ID_FORMA_PAGO);
|
|
|
|
|
|
AFormaPago.DataTable.Active := True;
|
|
|
|
|
|
if AFormaPago.DataTable.RecordCount <> 1 then
|
|
|
|
|
|
Exit; //No hay forma de pago en la factura y por lo tanto no se generan recibos
|
|
|
|
|
|
//raise Exception.Create('No existe la forma de pago de la factura');
|
|
|
|
|
|
|
|
|
|
|
|
ARecibosProveedorController := TRecibosProveedorController.Create;
|
|
|
|
|
|
//Eliminamos todos los recibos que tuviera la factura porque sabemos que todos
|
|
|
|
|
|
//estar<61>n pendientes (solo permitiremos modificar y eliminar facturas pendientes,
|
|
|
|
|
|
//parcialmente pagadas o pagadas no
|
|
|
|
|
|
ARecibos := ARecibosProveedorController.BuscarRecibosFactura(AFactura.ID);
|
|
|
|
|
|
ARecibosProveedorController.EliminarTodo(ARecibos);
|
|
|
|
|
|
|
|
|
|
|
|
//Vamos a generar todos los recibos necesarios para la factura
|
|
|
|
|
|
With AFormaPago.Plazos.DataTable do
|
|
|
|
|
|
begin
|
|
|
|
|
|
i := 1;
|
|
|
|
|
|
First;
|
|
|
|
|
|
while not eof do
|
|
|
|
|
|
begin
|
|
|
|
|
|
ARecibos := ARecibosProveedorController.Nuevo;
|
|
|
|
|
|
ARecibos.Edit;
|
|
|
|
|
|
ARecibos.ID_FACTURA := AFactura.ID;
|
|
|
|
|
|
ARecibos.REFERENCIA := AFactura.REFERENCIA + ' - ' + IntToStr(i);
|
2008-09-17 18:38:38 +00:00
|
|
|
|
ARecibos.FECHA_EMISION := AFactura.FECHA_FACTURA;
|
2008-09-25 17:28:31 +00:00
|
|
|
|
|
|
|
|
|
|
AFechaVencimiento := AFactura.FECHA_FACTURA + AFormaPago.Plazos.NUM_DIAS;
|
2008-09-30 17:25:06 +00:00
|
|
|
|
ADiasMas := 0;
|
2008-09-25 17:28:31 +00:00
|
|
|
|
if (AFactura.Proveedor.VENCIMIENTO_FACTURAS_1 <> 0)
|
|
|
|
|
|
or (AFactura.Proveedor.VENCIMIENTO_FACTURAS_2 <> 0)
|
|
|
|
|
|
or (AFactura.Proveedor.VENCIMIENTO_FACTURAS_3 <> 0) then
|
|
|
|
|
|
begin
|
|
|
|
|
|
ADiaVencimiento := DayOf(AFechaVencimiento);
|
|
|
|
|
|
while (ADiaVencimiento <> AFactura.Proveedor.VENCIMIENTO_FACTURAS_1)
|
|
|
|
|
|
and (ADiaVencimiento <> AFactura.Proveedor.VENCIMIENTO_FACTURAS_2)
|
|
|
|
|
|
and (ADiaVencimiento <> AFactura.Proveedor.VENCIMIENTO_FACTURAS_3) do
|
|
|
|
|
|
begin
|
|
|
|
|
|
if ADiaVencimiento = DaysInMonth(AFechaVencimiento) then
|
2008-09-26 12:43:32 +00:00
|
|
|
|
ADiaVencimiento := 1
|
|
|
|
|
|
else
|
|
|
|
|
|
Inc(ADiaVencimiento);
|
|
|
|
|
|
Inc(ADiasMas);
|
2008-09-25 17:28:31 +00:00
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
AFechaVencimiento := IncDay(AFechaVencimiento, ADiasMas);
|
|
|
|
|
|
ARecibos.FECHA_VENCIMIENTO := AFechaVencimiento;
|
|
|
|
|
|
|
2007-11-16 20:58:56 +00:00
|
|
|
|
ARecibos.IMPORTE := AFactura.IMPORTE_TOTAL * (AFormaPago.Plazos.PORCENTAJE / 100);
|
2008-09-25 17:28:31 +00:00
|
|
|
|
ARecibos.DESCRIPCION := 'Pago de factura ' + AFactura.REFERENCIA + ': son ' + CifraToLetras(ARecibos.IMPORTE);
|
2007-11-16 20:58:56 +00:00
|
|
|
|
ARecibosProveedorController.Guardar(ARecibos);
|
|
|
|
|
|
Inc(i);
|
|
|
|
|
|
Next;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
//Liberamos
|
|
|
|
|
|
AFormasPagoController := Nil;
|
|
|
|
|
|
AFormaPago := Nil;
|
|
|
|
|
|
ARecibosProveedorController := Nil;
|
|
|
|
|
|
ARecibos := Nil;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TFacturasProveedorController.GetProveedorController: IProveedoresController;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := FProveedorController;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TFacturasProveedorController.GetDetallesController: IDetallesFacturaProveedorController;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := FDetallesController;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
end.
|