2011-11-14 17:40:41 +00:00
unit uGenerarFacturasCliUtils;
interface
uses
Windows, SysUtils, Classes, pngimage, JSDialog,
uBizContratosCliente, uBizFacturasCliente;
type
TdmGenerarFacturasCli = class( TDataModule)
JsListaFacturasGenerados: TJSDialog;
2024-02-05 10:15:29 +00:00
JsListaFacturasAsignadasAContrato: TJSDialog;
2011-11-14 17:40:41 +00:00
end ;
2024-04-24 09:04:40 +00:00
function GenerarFacturaCli( const IDContrato : Integer ; const TenerEnCuentaFacturasExistentes: Boolean = false ) : Boolean ; overload ;
function GenerarFacturaCli( AContrato : IBizContratoCliente; var AFactura: IBizFacturaCliente; const AFacturasATenerEnCuenta: IBizFacturaCliente) : Boolean ; overload ;
2011-11-14 17:40:41 +00:00
// function ElegirPedidoYGenerarAlbaranCli(var IDAlbaran: Integer) : Boolean;
2024-02-05 10:15:29 +00:00
function AsignarContratoAFacturas( AContrato : IBizContratoCliente; var AFacturas: IBizFacturaCliente) : Boolean ;
2011-11-14 17:40:41 +00:00
implementation
{$R *.dfm}
uses
uDialogUtils, uBizDetallesContratoCliente, uBizDetallesFacturaCliente,
uContratosClienteController, uFacturasClienteController, uClientesController,
uDetallesFacturaClienteController, uControllerDetallesBase,
2012-01-19 11:24:07 +00:00
uBizContactos, schFacturasClienteClient_Intf, uFactuGES_App,
2022-03-12 10:40:36 +00:00
schContratosClienteClient_Intf, uBizDetallesPresupuestoCliente, uCalculosUtils;
2011-11-14 17:40:41 +00:00
var
dmGenerarFacturasCli: TdmGenerarFacturasCli;
AContratosClienteController : IContratosClienteController;
AFacturasClienteController : IFacturasClienteController;
AClientesController : IClientesController;
{ M<> todos auxiliares }
procedure CopiarContratoAFactura( AContrato: IBizContratoCliente; AFactura : IBizFacturaCliente) ;
begin
if not Assigned( AFactura) then
raise Exception. Create ( 'Factura no asignado (CopiarContratoAFactura)' ) ;
if not Assigned( AContrato) then
raise Exception. Create ( 'Contrato no asignado (CopiarContratoAFactura)' ) ;
if not AContrato. DataTable. Active then
AContrato. DataTable. Active : = True ;
// La factura tiene que venir ya abierto y posicionado donde hay que copiar
AFactura. ID_CLIENTE : = AContrato. ID_CLIENTE;
2023-02-10 17:16:11 +00:00
AFactura. ID_AGENTE : = AContrato. ID_AGENTE;
AFactura. NOMBRE_AGENTE : = AContrato. NOMBRE_AGENTE;
AFactura. DELEGACION : = AContrato. DELEGACION;
2011-11-14 17:40:41 +00:00
// Lo dejamos listo para que se localize la subcuenta contable asociada al cliente
AFacturasClienteController. RecuperarCliente( AFactura) ;
AFactura. Cliente. Open;
AFactura. NIF_CIF : = AContrato. NIF_CIF;
AFactura. NOMBRE : = AContrato. NOMBRE;
AFactura. CALLE : = AContrato. CALLE;
AFactura. POBLACION : = AContrato. POBLACION;
AFactura. PROVINCIA : = AContrato. PROVINCIA;
AFactura. CODIGO_POSTAL : = AContrato. CODIGO_POSTAL;
// AFactura.PERSONA_CONTACTO := AContrato.PERSONA_CONTACTO;
// AFactura.DataTable.FieldByName(fld_FacturasClientePLAZO_ENTREGA).AsVariant := AContrato.DataTable.FieldByName(fld_ContratosClientePLAZO_ENTREGA).AsVariant;
AFactura. DataTable. FieldByName( fld_FacturasClienteOBSERVACIONES) . AsVariant : = AContrato. DataTable. FieldByName( fld_ContratosClienteOBSERVACIONES) . AsVariant;
AFactura. IMPORTE_NETO : = AContrato. IMPORTE_NETO;
AFactura. IMPORTE_PORTE : = AContrato. IMPORTE_PORTE;
AFactura. DESCUENTO : = AContrato. DESCUENTO;
AFactura. IMPORTE_DESCUENTO : = AContrato. IMPORTE_DESCUENTO;
AFactura. BASE_IMPONIBLE : = AContrato. BASE_IMPONIBLE;
2013-10-08 16:59:28 +00:00
AFactura. ID_TIPO_IVA : = AContrato. ID_TIPO_IVA;
AFactura. IVA : = AContrato. IVA;
AFactura. IMPORTE_IVA : = AContrato. IMPORTE_IVA;
2011-11-14 17:40:41 +00:00
AFactura. IMPORTE_TOTAL : = AContrato. IMPORTE_TOTAL;
// AFactura.ID_VENDEDOR := AContrato.ID_VENDEDOR;
2013-10-08 16:59:28 +00:00
AFactura. RECARGO_EQUIVALENCIA : = AContrato. RECARGO_EQUIVALENCIA;
AFactura. RE : = AContrato. RE;
AFactura. IMPORTE_RE : = AContrato. IMPORTE_RE;
2011-11-14 17:40:41 +00:00
AFactura. ID_CONTRATO : = AContrato. ID;
2023-12-04 14:04:07 +00:00
AFactura. REF_CONTRATO : = AContrato. REFERENCIA;
AFactura. REF_CLI_CONTRATO : = AContrato. REFERENCIA_CLIENTE;
2012-01-16 10:40:48 +00:00
AFactura. ID_FORMA_PAGO : = AContrato. ID_FORMA_PAGO;
2011-11-14 17:40:41 +00:00
end ;
procedure CopiarDetallesAFactura(
AContrato: IBizContratoCliente;
AFactura: IBizFacturaCliente;
AArticulos: IBizDetallesContratoCliente) ;
var
i : integer ;
ADetalles : IBizDetallesFacturaCliente;
ADetallesController : IDetallesFacturaClienteController;
begin
if not Assigned( AFactura) then
raise Exception. Create ( 'Factura no asignada (CopiarDetallesAFactura)' ) ;
if not Assigned( AContrato) then
raise Exception. Create ( 'Contrato no asignado (CopiarDetallesAFactura)' ) ;
if not Assigned( AArticulos) then
raise Exception. Create ( 'Art<72> culos no asignado (CopiarDetallesAFatura)' ) ;
if not AArticulos. DataTable. Active then
AArticulos. DataTable. Active : = True ;
// El contrato tiene que venir ya abierto y posicionado donde hay que copiar
ADetalles : = AFactura. Detalles;
ADetallesController : = TDetallesFacturaClienteController. Create;
try
//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( ADetalles) ;
AArticulos. DataTable. First;
for i : = 0 to AArticulos. DataTable. RecordCount - 1 do
begin
ADetallesController. Add( ADetalles, AArticulos. TIPO_DETALLE) ;
ADetalles. Edit;
ADetalles. REFERENCIA : = AArticulos. REFERENCIA;
ADetalles. ID_ARTICULO : = AArticulos. ID_ARTICULO;
2012-07-11 15:39:13 +00:00
if ( AArticulos. PROPIEDAD < > '' ) then
2013-04-26 12:34:42 +00:00
ADetalles. CONCEPTO : = AArticulos. PROPIEDAD + ' ' + AArticulos. CONCEPTO
2011-11-14 17:40:41 +00:00
else
ADetalles. CONCEPTO : = AArticulos. CONCEPTO;
if not AArticulos. CANTIDADIsNull then
ADetalles. CANTIDAD : = AArticulos. CANTIDAD;
if not AArticulos. IMPORTE_UNIDADIsNull then
2022-03-12 10:40:36 +00:00
ADetalles. IMPORTE_UNIDAD : = CalcularImporteNeto( AArticulos. IMPORTE_UNIDAD, AArticulos. INCREMENTO, AArticulos. DECREMENTO) ;
2011-11-14 17:40:41 +00:00
if not AArticulos. IMPORTE_TOTALIsNull then
ADetalles. IMPORTE_TOTAL : = AArticulos. IMPORTE_TOTAL;
if not AArticulos. DESCUENTOIsNull then
ADetalles. DESCUENTO : = AArticulos. DESCUENTO;
if not AArticulos. IMPORTE_PORTEIsNull then
ADetalles. IMPORTE_PORTE : = AArticulos. IMPORTE_PORTE;
ADetalles. VISIBLE : = AArticulos. VISIBLE;
ADetalles. REFERENCIA_PROVEEDOR : = AArticulos. REFERENCIA_PROVEEDOR;
ADetalles. Post;
AArticulos. Next;
end ;
finally
ADetallesController. EndUpdate( ADetalles) ;
ADetallesController : = NIL ;
end ;
end ;
procedure Inicializar;
begin
dmGenerarFacturasCli : = TdmGenerarFacturasCli. Create( nil ) ;
AContratosClienteController : = TContratosClienteController. Create;
AFacturasClienteController : = TFacturasClienteController. Create;
AClientesController : = TClientesController. Create;
end ;
procedure Finalizar;
begin
FreeAndNIL( dmGenerarFacturasCli) ;
AContratosClienteController : = nil ;
AFacturasClienteController : = nil ;
AClientesController : = nil ;
end ;
2024-04-24 09:04:40 +00:00
function GenerarFacturaCli( const IDContrato : Integer ; const TenerEnCuentaFacturasExistentes: Boolean = false ) : Boolean ; overload ;
2011-11-14 17:40:41 +00:00
var
AContrato : IBizContratoCliente;
AFactura : IBizFacturaCliente;
2024-04-24 09:04:40 +00:00
AFacturasRelacionadas : IBizFacturaCliente;
2011-11-14 17:40:41 +00:00
begin
Result : = False ;
2024-04-24 09:04:40 +00:00
AFacturasRelacionadas : = Nil ;
2011-11-14 17:40:41 +00:00
try
if not Assigned( AContratosClienteController) then
Inicializar;
2024-04-24 09:04:40 +00:00
if TenerEnCuentaFacturasExistentes then
begin
AFacturasRelacionadas : = AFacturasClienteController. ElegirFacturas( AFacturasClienteController. BuscarTodasDelContrato( IDContrato) ,
'Elija la/s factura/s de cliente que desea tener en cuenta para dar de alta la nueva factura.'
, True ) ;
end ;
2011-11-14 17:40:41 +00:00
AContrato : = AContratosClienteController. Buscar( IDContrato) ;
if Assigned( AContrato) then
2024-04-24 09:04:40 +00:00
Result : = GenerarFacturaCli( AContrato, AFactura, AFacturasRelacionadas) ;
2011-11-14 17:40:41 +00:00
finally
if Assigned( AContratosClienteController) then
Finalizar;
end ;
end ;
2024-04-24 09:04:40 +00:00
function GenerarFacturaCli( AContrato : IBizContratoCliente; var AFactura: IBizFacturaCliente; const AFacturasATenerEnCuenta: IBizFacturaCliente) : Boolean ; overload ;
2011-11-14 17:40:41 +00:00
var
ARespuesta : Integer ;
2024-04-24 09:04:40 +00:00
ACadena : String ;
2011-11-14 17:40:41 +00:00
begin
AFactura : = NIL ;
if not Assigned( AContrato) then
raise Exception. Create( 'Contrato de cliente no asignado (GenerarContratoCli)' ) ;
if not AContrato. DataTable. Active then
AContrato. DataTable. Active : = True ;
2024-04-24 09:04:40 +00:00
if not Assigned( AFacturasClienteController) then
2011-11-14 17:40:41 +00:00
Inicializar;
try
AFactura : = AFacturasClienteController. Nuevo;
2013-06-19 09:44:10 +00:00
AFactura. ID_EMPRESA : = AppFactuGES. EmpresaActiva. ID;
2022-10-21 09:41:20 +00:00
AFactura. ID_TIENDA : = AContrato. ID_TIENDA;
AFactura. TIENDA : = AContrato. TIENDA;
2016-08-09 11:13:02 +00:00
//Solicitado por Ang<6E> lica, al generar una factura a partir del contrato, que se copie el IVA asignado en el contrato
// AFactura.ID_TIPO_IVA := AppFactuGES.EmpresaActiva.ID_TIPO_IVA; //SIEMPRE SE ASIGNAR<41> EL IVA DE LA EMPRESA ACTIVA
2011-11-14 17:40:41 +00:00
CopiarContratoAFactura( AContrato, AFactura) ;
CopiarDetallesAFactura( AContrato, AFactura, AContrato. Detalles) ;
2024-04-24 09:04:40 +00:00
//A<> adir lineas descuento con las facturas seleccionadas si las hubiera Solicitado por EVA
//Presupuesto aceptado 5 de marzo 2024
if Assigned( AFacturasATenerEnCuenta) then
begin
if not AFacturasATenerEnCuenta. DataTable. Active then
AFacturasATenerEnCuenta. DataTable. Active : = True ;
try
//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
AFacturasClienteController. DetallesController. BeginUpdate( AFactura. Detalles) ;
AFacturasATenerEnCuenta. DataTable. First;
while not AFacturasATenerEnCuenta. DataTable. EOF do
begin
ACadena : = 'Pago a cuenta incluido en ' ;
AFacturasClienteController. DetallesController. Add( AFactura. Detalles, TIPO_DETALLE_CONCEPTO) ;
AFactura. Detalles. Edit;
//ADetalles.REFERENCIA := AArticulos.REFERENCIA;
//ADetalles.ID_ARTICULO := AArticulos.ID_ARTICULO;
if AFacturasATenerEnCuenta. TIPO = CTE_TIPO_FACTURA then
begin
AFactura. Detalles. CANTIDAD : = - 1 ;
ACadena : = ACadena + 'Factura ' ;
end
else
begin
AFactura. Detalles. CANTIDAD : = 1 ;
ACadena : = ACadena + 'Abono '
end ;
AFactura. Detalles. CONCEPTO : = ACadena + AFacturasATenerEnCuenta. REFERENCIA + ' con fecha ' + DateToStr( AFacturasATenerEnCuenta. FECHA_FACTURA) ;
if not AFacturasATenerEnCuenta. BASE_IMPONIBLEIsNull then
AFactura. Detalles. IMPORTE_UNIDAD : = AFacturasATenerEnCuenta. BASE_IMPONIBLE;
AFactura. Detalles. Post;
AFacturasATenerEnCuenta. DataTable. Next;
end ;
finally
AFacturasClienteController. DetallesController. EndUpdate( AFactura. Detalles) ;
AFacturasClienteController. RecalcularImportes( AFactura) ;
end ;
end ;
2023-12-04 14:04:07 +00:00
AFacturasClienteController. Ver( AFactura) ;
2011-11-14 17:40:41 +00:00
//Sustituir por if de guardar
2023-12-04 14:04:07 +00:00
{ if AFacturasClienteController. Guardar( AFactura) then
2011-11-14 17:40:41 +00:00
begin
with dmGenerarFacturasCli. JsListaFacturasGenerados do
begin
Instruction. Text : = 'Se ha generado la factura' ;
Content. Clear;
Content. Add( Format( 'Se ha generado correctamente la factura %s a partir del contrato de cliente' + #10 #13 , [ AFactura. REFERENCIA] ) ) ;
Execute;
ARespuesta : = CustomButtonResult;
case ARespuesta of
1 0 0 : begin
2023-12-04 14:04:07 +00:00
// Ver la factura
2011-11-14 17:40:41 +00:00
AFacturasClienteController. Ver( AFactura) ;
end ;
2 0 0 : // Continuar;
end ;
end ;
end ;
2023-12-04 14:04:07 +00:00
}
2011-11-14 17:40:41 +00:00
Result : = True ;
finally
if Assigned( AContratosClienteController) then
Finalizar;
end ;
end ;
{
function ElegirPedidoYGenerarAlbaranCli( var IDAlbaran: Integer ) : Boolean ; overload ;
var
APedido : IBizPedidoCliente;
AAlbaran : IBizAlbaranCliente;
begin
Result : = False ;
IDAlbaran : = - 1 ;
AAlbaran : = NIL ;
try
if not Assigned( APedidosClienteController) then
Inicializar;
APedido : = APedidosClienteController. ElegirPedidos( APedidosClienteController. BuscarPendientes,
'Elija el pedido de cliente que desea utilizar para dar de alta el albar<61> n de cliente.'
, False ) ;
if Assigned( APedido) then
begin
Result : = GenerarAlbaranCli( APedido, AAlbaran) ;
if Result then
IDAlbaran : = AAlbaran. ID;
end ;
finally
if Assigned( APedidosClienteController) then
Finalizar;
end ;
end ;
}
2024-02-05 10:15:29 +00:00
function AsignarContratoAFacturas( AContrato : IBizContratoCliente; var AFacturas: IBizFacturaCliente) : Boolean ;
var
i: integer ;
begin
Result : = False ;
if not Assigned( AFacturas) then
raise Exception. Create ( 'Facturas no asignadas (AsignarContratoAFacturas)' ) ;
if not Assigned( AContrato) then
raise Exception. Create ( 'Contrato no asignado (AsignarContratoAFacturas)' ) ;
if not AFacturas. DataTable. Active then
AFacturas. DataTable. Active : = True ;
if not Assigned( AContratosClienteController) then
Inicializar;
with dmGenerarFacturasCli. JsListaFacturasAsignadasAContrato do
begin
Content. Clear;
AFacturas. DataTable. First;
for i : = 0 to AFacturas. DataTable. RecordCount - 1 do
begin
2024-09-12 16:51:35 +00:00
if ( AFacturas. SITUACION = CTE_PENDIENTE) then
2024-02-05 10:15:29 +00:00
begin
AFacturas. Edit;
AFacturas. ID_CONTRATO : = AContrato. ID;
Content. Add( AFacturas. REFERENCIA + ': Asignado contrato ' + AContrato. REFERENCIA) ;
AFacturas. Post;
Result : = True ;
end
else
2024-09-12 16:51:35 +00:00
Content. Add( AFacturas. REFERENCIA + ': La factura est<73> pagada o parcialmente pagada, por lo que no se puede modificar el contrato asociado ' + AFacturas. REF_CONTRATO) ;
2024-02-05 10:15:29 +00:00
AFacturas. Next;
end ;
end ;
dmGenerarFacturasCli. JsListaFacturasAsignadasAContrato. Execute;
AFacturas. DataTable. ApplyUpdates;
end ;
2011-11-14 17:40:41 +00:00
end .