AbetoDesign_FactuGES2/Source/Modulos/Relaciones/Presupuestos de cliente - Contratos de cliente/uGenerarContratosCliUtils.pas

414 lines
15 KiB
ObjectPascal
Raw Normal View History

unit uGenerarContratosCliUtils;
interface
uses
Windows, SysUtils, Classes, pngimage, JSDialog,
uBizPresupuestosCliente, uBizContratosCliente;
type
TdmGenerarContratosCli = class(TDataModule)
JsListaContratosGenerados: TJSDialog;
end;
function GenerarContratoCli(const IDPresupuesto : Integer; const APreguntaMostrarContrato : Boolean = True) : Boolean; overload;
// function GenerarContratoCli(APresupuesto : IBizPresupuestoCliente; var AContrato: IBizContratoCliente;
// const APreguntaMostrarContrato : Boolean = True) : Boolean; overload;
function GenerarContratosCli : Boolean; overload;
function GenerarContratosCli(APresupuestos : IBizPresupuestoCliente) : Boolean; overload;
// function ElegirPedidoYGenerarAlbaranCli(var IDAlbaran: Integer) : Boolean;
implementation
{$R *.dfm}
uses
uDialogUtils, uBizDetallesPresupuestoCliente, uBizDetallesContratoCliente,
uPresupuestosClienteController, uContratosClienteController, uClientesController,
uDetallesContratoClienteController, uControllerDetallesBase,
uBizContactos, schPresupuestosClienteClient_Intf,
schContratosClienteClient_Intf, uDireccionesContactoController,
uBizDireccionesContacto, uFactuGES_App;
var
dmGenerarContratosCli: TdmGenerarContratosCli;
APresupuestosClienteController : IPresupuestosClienteController;
AContratosClienteController : IContratosClienteController;
ADireccionesController : IDireccionesContactoController;
AClientesController : IClientesController;
{ M<>todos auxiliares }
procedure PreguntarMostrarContrato(AContrato : IBizContratoCliente);
var
ARespuesta : Integer;
begin
if not Assigned(AContrato) then
raise Exception.Create ('Contrato no asignado (PreguntaSiMostrarContrato)');
with dmGenerarContratosCli.JsListaContratosGenerados do
begin
Instruction.Text := 'Se ha generado el contrato';
Content.Clear;
Content.Add(Format('Se ha generado correctamente el contrato %s a partir del presupuesto de cliente' + #10#13,
[AContrato.REFERENCIA]));
Execute;
ARespuesta := CustomButtonResult;
case ARespuesta of
100 : begin
// Ver el albar<61>n
AContratosClienteController.Ver(AContrato);
end;
200 : // Continuar;
end;
end;
end;
procedure CopiarPresupuestoAContrato(APresupuesto: IBizPresupuestoCliente;
AContrato : IBizContratoCliente);
var
FDireccion: IBizDireccionesContacto;
begin
if not Assigned(AContrato) then
raise Exception.Create ('Contrato no asignado (CopiarPresupuestoAContrato)');
if not Assigned(APresupuesto) then
raise Exception.Create ('Presupuesto no asignado (CopiarPresupuestoAContrato)');
if not APresupuesto.DataTable.Active then
APresupuesto.DataTable.Active := True;
// El contrato tiene que venir ya abierto y posicionado donde hay que copiar
AContrato.ID_CLIENTE := APresupuesto.ID_CLIENTE;
AContrato.NIF_CIF := APresupuesto.NIF_CIF;
AContrato.NOMBRE := APresupuesto.NOMBRE;
APresupuestosClienteController.RecuperarCliente(APresupuesto);
APresupuesto.Cliente.Open;
FDireccion := ADireccionesController.Nuevo;
try
if (not APresupuesto.ID_DIRECCIONIsNull) and
(ADireccionesController.Localizar(APresupuesto.Cliente.Direcciones, APresupuesto.ID_DIRECCION)) then
ADireccionesController.CopiarDireccion(APresupuesto.Cliente.Direcciones, FDireccion)
else
ADireccionesController.CopiarDireccionFiscal(APresupuesto.Cliente, FDireccion);
AContrato.CALLE := FDireccion.CALLE;
AContrato.POBLACION := FDireccion.POBLACION;
AContrato.PROVINCIA := FDireccion.PROVINCIA;
AContrato.CODIGO_POSTAL := FDireccion.CODIGO_POSTAL;
finally
FDireccion := NIL;
end;
AContrato.TELEFONO := APresupuesto.Cliente.TELEFONO_1;
AContrato.MOVIL := APresupuesto.Cliente.MOVIL_1;
AContrato.PERSONA_CONTACTO := APresupuesto.PERSONA_CONTACTO;
AContrato.DataTable.FieldByName(fld_ContratosClientePLAZO_ENTREGA).AsVariant := APresupuesto.DataTable.FieldByName(fld_PresupuestosClientePLAZO_ENTREGA).AsVariant;
AContrato.DataTable.FieldByName(fld_ContratosClienteOBSERVACIONES).AsVariant := APresupuesto.DataTable.FieldByName(fld_PresupuestosClienteOBSERVACIONES).AsVariant;
AContrato.IMPORTE_NETO := APresupuesto.IMPORTE_NETO;
AContrato.IMPORTE_PORTE := APresupuesto.IMPORTE_PORTE;
AContrato.DESCUENTO := APresupuesto.DESCUENTO;
AContrato.IMPORTE_DESCUENTO := APresupuesto.IMPORTE_DESCUENTO;
AContrato.BASE_IMPONIBLE := APresupuesto.BASE_IMPONIBLE;
AContrato.ID_TIPO_IVA := APresupuesto.ID_TIPO_IVA;
AContrato.IVA := APresupuesto.IVA;
AContrato.IMPORTE_IVA := APresupuesto.IMPORTE_IVA;
AContrato.IMPORTE_TOTAL := APresupuesto.IMPORTE_TOTAL;
AContrato.ID_VENDEDOR := APresupuesto.ID_VENDEDOR;
AContrato.RECARGO_EQUIVALENCIA := APresupuesto.RECARGO_EQUIVALENCIA;
AContrato.RE := APresupuesto.RE;
AContrato.IMPORTE_RE := APresupuesto.IMPORTE_RE;
AContrato.TIPO_CONTRATO := APresupuesto.TIPO_PRESUPUESTO;
AContrato.REFERENCIA_CLIENTE := APresupuesto.REFERENCIA_CLIENTE;
AContrato.ID_FORMA_PAGO := APresupuesto.ID_FORMA_PAGO;
AContrato.DataTable.FieldByName(fld_ContratosClienteFORMA_PAGO).AsVariant := APresupuesto.DataTable.FieldByName(fld_PresupuestosClienteFORMA_PAGO).AsVariant;
end;
procedure CopiarDetallesAContrato(
APresupuesto: IBizPresupuestoCliente;
AContrato: IBizContratoCliente;
AArticulos: IBizDetallesPresupuestoCliente);
var
i : integer;
ADetalles : IBizDetallesContratoCliente;
ADetallesController : IDetallesContratoClienteController;
begin
if not Assigned(AContrato) then
raise Exception.Create ('Contrato no asignado (CopiarDetallesAContrato)');
if not Assigned(APresupuesto) then
raise Exception.Create ('Presupuesto no asignado (CopiarDetallesAContrato)');
if not Assigned(AArticulos) then
raise Exception.Create ('Art<72>culos no asignado (CopiarDetallesAContrato)');
if not AArticulos.DataTable.Active then
AArticulos.DataTable.Active := True;
// El contrato tiene que venir ya abierto y posicionado donde hay que copiar
ADetalles := AContrato.Detalles;
ADetallesController := TDetallesContratoClienteController.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
//En el caso de tener alg<6C>n capitulo de cocina vacio (cocina de presupuestos)
//se a<>ade un capitulo de cocina con sus propiedades para el contrato
if ((AArticulos.TIPO_DETALLE = TIPO_DETALLE_TITULO)
and (AArticulos.TIPO_ARTICULO = TIPO_CAPITULO_C_VACIO)) then
ADetallesController.AnadirCapitulo(TIPO_CAPITULO_C,'MUEBLES DE COCINA ', False, ADetalles);
//En contratos ya no existir<69> ning<6E>n capitulo opcional todos sumar<61>n
if (AArticulos.TIPO_DETALLE = TIPO_DETALLE_TITULO_OPCIONAL) then
ADetallesController.Add(ADetalles, TIPO_DETALLE_TITULO)
else
ADetallesController.Add(ADetalles, AArticulos.TIPO_DETALLE);
ADetalles.Edit;
ADetalles.REFERENCIA := AArticulos.REFERENCIA;
ADetalles.ID_ARTICULO := AArticulos.ID_ARTICULO;
ADetalles.TIPO_ARTICULO := AArticulos.TIPO_ARTICULO;
ADetalles.PROPIEDAD := AArticulos.PROPIEDAD;
ADetalles.CONCEPTO := AArticulos.CONCEPTO;
if not AArticulos.CANTIDADIsNull then
ADetalles.CANTIDAD := AArticulos.CANTIDAD;
if not AArticulos.IMPORTE_UNIDADIsNull then
ADetalles.IMPORTE_UNIDAD := AArticulos.IMPORTE_UNIDAD;
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.VALORADO := AArticulos.VALORADO;
ADetalles.REFERENCIA_PROVEEDOR := AArticulos.REFERENCIA_PROVEEDOR;
ADetalles.Post;
AArticulos.Next;
end;
finally
ADetallesController.EndUpdate(ADetalles);
ADetallesController := NIL;
end;
end;
procedure Inicializar;
begin
dmGenerarContratosCli := TdmGenerarContratosCli.Create(nil);
APresupuestosClienteController := TPresupuestosClienteController.Create;
AContratosClienteController := TContratosClienteController.Create;
AClientesController := TClientesController.Create;
ADireccionesController := TDireccionesContactoController.Create;
end;
procedure Finalizar;
begin
FreeAndNIL(dmGenerarContratosCli);
APresupuestosClienteController := nil;
AContratosClienteController := nil;
AClientesController := nil;
ADireccionesController := nil;
end;
function GenerarContratoCli(const IDPresupuesto : Integer; const APreguntaMostrarContrato : Boolean = True) : Boolean; overload;
var
APresupuesto : IBizPresupuestoCliente;
AContrato : IBizContratoCliente;
begin
Result := False;
try
if not Assigned(APresupuestosClienteController) then
Inicializar;
APresupuesto := APresupuestosClienteController.Buscar(IDPresupuesto);
if Assigned(APresupuesto) then
Result := GenerarContratosCli(APresupuesto); //, AContrato);
finally
if Assigned(APresupuestosClienteController) then
Finalizar;
end;
end;
//Desactivamos la creaci<63>n de contrato anterior
//UN UNICO CONTRATO POR PRESUPUESTO
{
function GenerarContratoCli(APresupuesto : IBizPresupuestoCliente; var AContrato: IBizContratoCliente; const APreguntaMostrarContrato : Boolean = True) : Boolean; overload;
begin
AContrato := NIL;
if not Assigned(APresupuesto) then
raise Exception.Create('Presupuesto de cliente no asignado (GenerarContratoCli)');
if not APresupuesto.DataTable.Active then
APresupuesto.DataTable.Active := True;
if not Assigned(APresupuestosClienteController) then
Inicializar;
try
AContrato := AContratosClienteController.Nuevo;
AContrato.ID_EMPRESA := AppFactuGES.EmpresaActiva.ID;
AContrato.ID_TIENDA := AppFactuGES.TiendaActiva.ID;
AContrato.TIENDA := AppFactuGES.TiendaActiva.NOMBRE;
CopiarPresupuestoAContrato(APresupuesto, AContrato);
CopiarDetallesAContrato(APresupuesto, AContrato, APresupuesto.Detalles);
//Sustituir por if de guardar
if AContratosClienteController.Guardar(AContrato) then
begin
// Asocio el contrato al presupuesto
APresupuesto.Edit;
APresupuesto.ID_CONTRATO := AContrato.ID;
APresupuesto.Post;
APresupuestosClienteController.Guardar(APresupuesto);
if APreguntaMostrarContrato then
PreguntarMostrarContrato(AContrato);
end;
Result := True;
finally
if Assigned(APresupuestosClienteController) 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;
}
function GenerarContratosCli : Boolean; overload;
// Generara tantos contratos como clientes distintos tenga en la lista de presupuestos seleccionada
var
APresupuestos : IBizPresupuestoCliente;
begin
Result := False;
try
if not Assigned(APresupuestosClienteController) then
Inicializar;
APresupuestos := APresupuestosClienteController.ElegirPresupuestos(APresupuestosClienteController.BuscarSinContrato,
'Elija el presupuesto/s de cliente aceptado que desea utilizar para dar de alta el/los contrato/s correspondiente.'
, True);
if Assigned(APresupuestos) then
Result := GenerarContratosCli(APresupuestos);
finally
if Assigned(APresupuestosClienteController) then
Finalizar;
end;
end;
function GenerarContratosCli(APresupuestos : IBizPresupuestoCliente) : Boolean; overload;
var
AContratosNuevos : IBizContratoCliente;
i: Integer;
ARespuesta : Integer;
begin
Result := False;
if not Assigned(APresupuestosClienteController) then
Inicializar;
if not Assigned(APresupuestos) then
raise Exception.Create('Presupuestos de cliente no asignado (GenerarContratosCli)');
if not APresupuestos.DataTable.Active then
APresupuestos.DataTable.Active := True;
try
AContratosNuevos := AContratosClienteController.Nuevo(False);
if AContratosClienteController.Anadir(AContratosNuevos, APresupuestos) then
begin
if AContratosNuevos.DataTable.RecordCount = 1 then
begin
with dmGenerarContratosCli.JsListaContratosGenerados do
begin
Instruction.Text := 'Se ha generado el contrato';
Content.Clear;
Content.Add(Format('Se ha generado correctamente el contrato %s a partir del presupuesto de cliente seleccionado' + #10#13,
[AContratosNuevos.REFERENCIA]));
end;
end
else begin
dmGenerarContratosCli.JsListaContratosGenerados.CustomButtons[0].Destroy;
with dmGenerarContratosCli.JsListaContratosGenerados.Content do
begin
Clear;
AContratosNuevos.DataTable.Last;
for i := 0 to AContratosNuevos.DataTable.RecordCount - 1 do
begin
if Length(AContratosNuevos.REFERENCIA) > 0 then
Add(AContratosNuevos.REFERENCIA + ': ' + AContratosNuevos.NOMBRE);
AContratosNuevos.DataTable.Prior;
end;
end;
end;
dmGenerarContratosCli.JsListaContratosGenerados.Execute;
ARespuesta := dmGenerarContratosCli.JsListaContratosGenerados.CustomButtonResult;
case ARespuesta of
100 : begin
// Ver el contrato
AContratosClienteController.Ver(AContratosNuevos);
end;
200 : // Continuar;
end;
end;
finally
AContratosNuevos := NIL;
end;
end;
end.