diff --git a/Source/Base/Base.dproj b/Source/Base/Base.dproj index e9bc58a4..aa2988cf 100644 --- a/Source/Base/Base.dproj +++ b/Source/Base/Base.dproj @@ -53,57 +53,57 @@ MainSource - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
fConfigurarConexion
diff --git a/Source/Base/Controladores/uControllerDetallesBase.pas b/Source/Base/Controladores/uControllerDetallesBase.pas index 9568ee95..f1ae2f00 100644 --- a/Source/Base/Controladores/uControllerDetallesBase.pas +++ b/Source/Base/Controladores/uControllerDetallesBase.pas @@ -10,7 +10,7 @@ const TIPO_DETALLE_SUBTOTAL = 'Subtotal'; TIPO_DETALLE_SALTO = 'Salto'; TIPO_DETALLE_DESCUENTO = 'Descuento'; - + TIPO_DETALLE_OPCIONAL = 'Opcional'; CTE_DESC_SALTO = 'SALTO DE PAGINA >>'; type @@ -19,7 +19,7 @@ type IControllerDetallesBase = interface(ISujeto) ['{F0B0E714-EC0D-4B6B-98B1-76F72F70B735}'] - function getTipo(ADataTable: IDAStronglyTypedDataTable; pPosicion: Integer): String; + function GetTipo(ADataTable: IDAStronglyTypedDataTable; pPosicion: Integer): String; procedure Clear(ADataTable: IDAStronglyTypedDataTable); procedure Add(ADataTable: IDAStronglyTypedDataTable; TipoConcepto: Variant); procedure Delete(ADataTable: IDAStronglyTypedDataTable; Posicion: TIntegerArray); @@ -35,6 +35,7 @@ type function LocalizarPosicion(ADataTable: IDAStronglyTypedDataTable; const APosicion: Integer): Boolean; procedure Renumerar(DataTable: TDADataTable; LocalizaPosicion: Integer); function DarListaTiposDetalle: TStringList; + procedure ValidarCierreCapitulos(ADataTable: IDAStronglyTypedDataTable); end; TControllerDetallesBase = class (TSujeto, IControllerDetallesBase) @@ -63,6 +64,8 @@ type procedure CalculoDetalleSubtotal(DataTable: TDADataTable; var ImporteAcumulado : Double; var ImporteTotal : Double); virtual; procedure TratamientoDetalleDescuento(DataTable: TDADataTable); virtual; procedure CalculoDetalleDescuento(DataTable: TDADataTable; var ImporteAcumulado : Double; var ImporteTotal : Double); virtual; + procedure TratamientoDetalleOpcional(DataTable: TDADataTable); virtual; + procedure CalculoDetalleOpcional(DataTable: TDADataTable; var ImporteAcumulado : Double; var ImporteTotal : Double); virtual; //Si sobreescribimos este metodo es para continuar el CalcularTotales segun los tipos de concepto de los hijos function CalcularTotalesHijos(Modificar: boolean; DataTable: TDADataTable; var ImporteAcumulado : Double; var ImporteTotal : Double): Double; virtual; @@ -71,7 +74,7 @@ type constructor Create; override; destructor Destroy; override; - function getTipo(ADataTable: IDAStronglyTypedDataTable; pPosicion: Integer): String; + function GetTipo(ADataTable: IDAStronglyTypedDataTable; pPosicion: Integer): String; procedure Clear(ADataTable: IDAStronglyTypedDataTable); procedure Add(ADataTable: IDAStronglyTypedDataTable; TipoConcepto: Variant); virtual; procedure Delete(ADataTable: IDAStronglyTypedDataTable; Posicion: TIntegerArray); virtual; @@ -86,6 +89,9 @@ type function DarTotalImporteTotal(ADataTable: IDAStronglyTypedDataTable): Double; function DarListaTiposDetalle: TStringList; virtual; function LocalizarPosicion(ADataTable: IDAStronglyTypedDataTable; const APosicion: Integer): Boolean; + + // Comprueba que todos los capitulos tengan su subtotal de cierre + procedure ValidarCierreCapitulos(ADataTable: IDAStronglyTypedDataTable); end; @@ -203,6 +209,13 @@ begin TratamientoDetalleConcepto(DataTable); //Se podrá sobreescribir para que se tengan en cuenta nuevos campos CalculoDetalleConcepto(DataTable, AuxImporteAcumulado, AuxImporteTotal); //Se podrá sobreescribir para posibles nuevos calculos de los hijos end + //OPCIONALES + else if (DataTable.FieldByName(CAMPO_TIPO).AsString = TIPO_DETALLE_OPCIONAL) then + begin + if Modificar then + TratamientoDetalleOpcional(DataTable); //Se podrá sobreescribir para que se tengan en cuenta nuevos campos en hijos + CalculoDetalleOpcional(DataTable, AuxImporteAcumulado, AuxImporteTotal); //Se podrá sobreescribir para posibles nuevos calculos de los hijos + end //HIJOS else CalcularTotalesHijos(Modificar, DataTable, AuxImporteAcumulado, AuxImporteTotal); @@ -243,12 +256,18 @@ begin begin if not Editing then Edit; ImporteDto := (-1)*((ImporteTotal * DataTable.FieldByName(CAMPO_DESCUENTO).AsFloat) / 100); - ImporteTotal := ImporteTotal + ImporteDto; + ImporteTotal := ImporteTotal + ImporteDto; FieldByName(CAMPO_IMPORTE_TOTAL).AsFloat := ImporteTotal; Post; end; end; +procedure TControllerDetallesBase.CalculoDetalleOpcional( + DataTable: TDADataTable; var ImporteAcumulado, ImporteTotal: Double); +begin + // No acumular ni sumar nada. +end; + procedure TControllerDetallesBase.CalculoDetalleSalto(DataTable: TDADataTable; var ImporteAcumulado, ImporteTotal: Double); begin with DataTable do @@ -291,6 +310,7 @@ function TControllerDetallesBase.DarListaTiposDetalle: TStringList; begin Result := TStringList.Create; Result.Values[TIPO_DETALLE_CONCEPTO] := TIPO_DETALLE_CONCEPTO; + Result.Values[TIPO_DETALLE_OPCIONAL] := TIPO_DETALLE_OPCIONAL; Result.Values[TIPO_DETALLE_TITULO] := TIPO_DETALLE_TITULO; Result.Values[TIPO_DETALLE_SUBTOTAL] := TIPO_DETALLE_SUBTOTAL; //Result.Values[TIPO_DETALLE_DESCUENTO] := TIPO_DETALLE_DESCUENTO; @@ -589,6 +609,22 @@ begin end; end; +procedure TControllerDetallesBase.TratamientoDetalleOpcional( + DataTable: TDADataTable); +begin + with DataTable do + begin + if not Editing then Edit; + //Si alguno de los campos de calculo de total es nulo el total tambien será nulo + if (VarIsNull(FieldByName(CAMPO_CANTIDAD).AsVariant) or + VarIsNull(FieldByName(CAMPO_IMPORTE_UNIDAD).AsVariant)) then + FieldByName(CAMPO_IMPORTE_TOTAL).AsVariant := Null + else + FieldByName(CAMPO_IMPORTE_TOTAL).AsFloat := CalcularImporteTotalConcepto(DataTable); + Post; + end; +end; + procedure TControllerDetallesBase.TratamientoDetalleSalto(DataTable: TDADataTable); begin with DataTable do @@ -629,7 +665,7 @@ begin end; end; -procedure TControllerDetallesBase.validarCampos(DataTable: TDADataTable); +procedure TControllerDetallesBase.ValidarCampos(DataTable: TDADataTable); var AField: TDAField; begin @@ -651,4 +687,66 @@ begin raise Exception.Create('Campo ' + CAMPO_IMPORTE_TOTAL + ' no encontrado (validarCampos)'); end; +procedure TControllerDetallesBase.ValidarCierreCapitulos( + ADataTable: IDAStronglyTypedDataTable); +var + ATipoCampo : String; + bEnCapitulo : Boolean; + AuxPosicionIni : Integer; + AuxPosicion : Integer; +begin + bEnCapitulo := False; + ATipoCampo := ''; + + if (ADataTable.DataTable.State in dsEditModes) then + ADataTable.DataTable.Post; + + ValidarCampos(ADataTable.DataTable); + + AuxPosicionIni := ADataTable.DataTable.FieldByName(CAMPO_POSICION).AsInteger; + AuxPosicion := 0; + + BeginUpdate(ADataTable); + try + ADataTable.DataTable.First; + while ADataTable.DataTable.Locate(CAMPO_POSICION, AuxPosicion, []) do + begin + ATipoCampo := ADataTable.DataTable.FieldByName(CAMPO_TIPO).AsString; + + if (ATipoCampo = TIPO_DETALLE_SUBTOTAL) and bEnCapitulo then + bEnCapitulo := False; + + if (ATipoCampo = TIPO_DETALLE_TITULO) then + begin + if bEnCapitulo then + begin + ADataTable.DataTable.First; + if ADataTable.DataTable.Locate(CAMPO_POSICION, AuxPosicion-1, []) then + begin + Add(ADataTable, TIPO_DETALLE_SUBTOTAL); + bEnCapitulo := False; + end; + end + else + bEnCapitulo := True; + end; + + Inc(AuxPosicion); + ADataTable.DataTable.First; + end; + + // ¿Se ha acabado la tabla y queda algún capítulo sin cerrar? + if bEnCapitulo then + if ADataTable.DataTable.Locate(CAMPO_POSICION, AuxPosicion-1, []) then + begin + Add(ADataTable, TIPO_DETALLE_SUBTOTAL); + bEnCapitulo := False; + end; + finally + //Dejamos el puntero en la misma posición que la que partió + ADataTable.DataTable.Locate(CAMPO_POSICION, AuxPosicionIni, []); + EndUpdate(ADataTable); + end; +end; + end. diff --git a/Source/Modulos/Presupuestos de cliente/Controller/uPresupuestosClienteController.pas b/Source/Modulos/Presupuestos de cliente/Controller/uPresupuestosClienteController.pas index af0263b7..f0bd6e40 100644 --- a/Source/Modulos/Presupuestos de cliente/Controller/uPresupuestosClienteController.pas +++ b/Source/Modulos/Presupuestos de cliente/Controller/uPresupuestosClienteController.pas @@ -452,7 +452,10 @@ begin if (APresupuesto.Detalles.DataTable.RecordCount = 0) then raise Exception.Create('El presupuesto debe tener en su contenido al menos un concepto'); - + + + FDetallesController.ValidarCierreCapitulos(APresupuesto.Detalles); + { Asegurarse de valores en campos "automáticos" tanto en MODIFICACIÓN como en INSERCIÓN. } APresupuesto.Edit; diff --git a/Source/Servidor/FactuGES_Server.RES b/Source/Servidor/FactuGES_Server.RES index 45676971..e3b4701a 100644 Binary files a/Source/Servidor/FactuGES_Server.RES and b/Source/Servidor/FactuGES_Server.RES differ diff --git a/Source/Servidor/FactuGES_Server.rc b/Source/Servidor/FactuGES_Server.rc index b72791a3..ee464bf2 100644 --- a/Source/Servidor/FactuGES_Server.rc +++ b/Source/Servidor/FactuGES_Server.rc @@ -14,7 +14,7 @@ BEGIN BEGIN VALUE "FileVersion", "1.3.1.0\0" VALUE "ProductVersion", "1.3.1.0\0" - VALUE "CompileDate", "miércoles, 10 de septiembre de 2008 18:00\0" + VALUE "CompileDate", "lunes, 15 de septiembre de 2008 17:04\0" END END BLOCK "VarFileInfo"