unit uBizFacturasCliente; interface uses uDAInterfaces, uDADataTable, schFacturasClienteClient_Intf, uBizContactos, uBizDetallesFacturaCliente, Classes; const BIZ_CLIENT_FACTURA_CLIENTE = 'Client.FacturaCliente'; SITUACION_PENDIENTE = 'Pendiente'; SITUACION_PAGADO = 'Pagado'; DIAS_VENCIMIENTO = 30; type IBizFacturaCliente = interface(IFacturasCliente) ['{36145458-DB0B-4A53-A17C-0B20B473D831}'] procedure SetCliente(AValue : IBizCliente); function GetCliente : IBizCliente; property Cliente : IBizCliente read GetCliente write SetCliente; function GetDetalles: IBizDetallesFacturaCliente; procedure SetDetalles(Value: IBizDetallesFacturaCliente); property Detalles: IBizDetallesFacturaCliente read GetDetalles write SetDetalles; function EsNuevo : Boolean; procedure CalcularImporteTotal; function DarListaSituaciones: TStringList; end; TBizFacturaCliente = class(TFacturasClienteDataTableRules, IBizFacturaCliente) private procedure CalcularDescuento; procedure CalcularIVA; protected FCliente : IBizCliente; FDetalles : IBizDetallesFacturaCliente; FDetallesLink : TDADataSource; procedure SetCliente(AValue : IBizCliente); function GetCliente : IBizCliente; function GetDetalles: IBizDetallesFacturaCliente; procedure SetDetalles(Value: IBizDetallesFacturaCliente); procedure SetBASE_IMPONIBLEValue(const aValue: Float); override; procedure SetDESCUENTOValue(const aValue: Double); override; procedure SetIVAValue(const aValue: Double); override; procedure SetFECHA_PAGADOValue(const aValue: TDateTime); override; procedure OnNewRecord(Sender: TDADataTable); override; procedure OnCalcFields(Sender: TDADataTable); override; public function EsNuevo : Boolean; procedure IniciarValoresFacturaNueva; procedure CalcularImporteTotal; function DarListaSituaciones: TStringList; property Cliente : IBizCliente read GetCliente write SetCliente; property Detalles: IBizDetallesFacturaCliente read GetDetalles write SetDetalles; constructor Create(aDataTable: TDADataTable); override; destructor Destroy; override; end; implementation uses SysUtils, uDataTableUtils, DB, uDateUtils, DateUtils, uDataModuleUsuarios, Variants, cxDateUtils; { TBizFacturaCliente } function TBizFacturaCliente.EsNuevo: Boolean; begin Result := (ID < 0); end; procedure TBizFacturaCliente.CalcularDescuento; begin if not Self.DataTable.Editing then Edit; IMPORTE_DESCUENTO := (DESCUENTO / 100) * BASE_IMPONIBLE; end; procedure TBizFacturaCliente.CalcularImporteTotal; begin CalcularDescuento; //Importante orden CalcularIVA; if not Self.DataTable.Editing then Edit; IMPORTE_TOTAL := BASE_IMPONIBLE - IMPORTE_DESCUENTO + IMPORTE_IVA; end; procedure TBizFacturaCliente.CalcularIVA; begin if not Self.DataTable.Editing then Edit; IMPORTE_IVA := (IVA / 100) * (BASE_IMPONIBLE - IMPORTE_DESCUENTO); end; constructor TBizFacturaCliente.Create(aDataTable: TDADataTable); begin inherited; FCliente := Nil; FDetallesLink := TDADataSource.Create(NIL); FDetallesLink.DataTable := aDataTable; end; function TBizFacturaCliente.DarListaSituaciones: TStringList; begin Result := TStringList.Create; with Result do begin Add(SITUACION_PENDIENTE); Add(SITUACION_PAGADO); end; end; destructor TBizFacturaCliente.Destroy; begin FCliente := NIL; FDetalles := NIL; FDetallesLink.Free; inherited; end; function TBizFacturaCliente.GetCliente: IBizCliente; begin Result := FCliente; end; function TBizFacturaCliente.GetDetalles: IBizDetallesFacturaCliente; begin Result := FDetalles; end; procedure TBizFacturaCliente.IniciarValoresFacturaNueva; begin ID_EMPRESA := dmUsuarios.IDEmpresaActual; USUARIO := dmUsuarios.LoginInfo.Usuario; FECHA_FACTURA := DateOf(Now); VENCIMIENTO := DIAS_VENCIMIENTO; SITUACION := SITUACION_PENDIENTE; ID_CLIENTE := ID_NULO; FECHA_PAGADO := 0; IVA := dmUsuarios.EmpresaActual.IVA; end; procedure TBizFacturaCliente.OnCalcFields(Sender: TDADataTable); begin inherited; FECHA_VENCIMIENTO := IncDay(FECHA_FACTURA, VENCIMIENTO); end; procedure TBizFacturaCliente.OnNewRecord(Sender: TDADataTable); begin inherited; ID := GetRecNo; // -1, -2, -3... IniciarValoresFacturaNueva; end; procedure TBizFacturaCliente.SetBASE_IMPONIBLEValue(const aValue: Float); begin inherited; CalcularImporteTotal; end; procedure TBizFacturaCliente.SetCliente(AValue: IBizCliente); var bEnEdicion : Boolean; begin FCliente := AValue; bEnEdicion := (DataTable.State in dsEditModes); if not bEnEdicion then Edit; if Assigned(FCliente) then begin if not FCliente.DataTable.Active then FCliente.DataTable.Active := True; ID_CLIENTE := FCliente.ID; NOMBRE := FCliente.NOMBRE; NIF_CIF := FCliente.NIF_CIF; CALLE := FCliente.CALLE; CODIGO_POSTAL := FCliente.CODIGO_POSTAL; PROVINCIA := FCliente.PROVINCIA; POBLACION := FCliente.POBLACION; Post; if bEnEdicion then Edit; end end; procedure TBizFacturaCliente.SetDESCUENTOValue(const aValue: Double); begin inherited; CalcularImporteTotal; end; procedure TBizFacturaCliente.SetDetalles(Value: IBizDetallesFacturaCliente); begin FDetalles := Value; EnlazarMaestroDetalle(FDetallesLink, FDetalles); end; procedure TBizFacturaCliente.SetFECHA_PAGADOValue(const aValue: TDateTime); begin if EsFechaVacia(aValue) then DataTable.Fields[idx_FacturasClienteFECHA_PAGADO].AsVariant := NULL else inherited; end; procedure TBizFacturaCliente.SetIVAValue(const aValue: Double); begin inherited; CalcularImporteTotal; end; initialization RegisterDataTableRules(BIZ_CLIENT_FACTURA_CLIENTE, TBizFacturaCliente); finalization end.