public static Response<ComprobanteEgreso> Patch(this ComprobanteEgreso request, Factory factory, IAuthSession authSession, string action) { int factor; string operacion; string rule; Action<DALProxy> toDo=null; if(action=="asentar") { rule=Definiciones.CheckRequestBeforeAsentar; operacion= Operaciones.Asentar; factor=1; toDo= request.Asentar; } else if(action=="reversar") { rule=Definiciones.CheckRequestBeforeReversar; operacion= Operaciones.Reversar; factor=-1; toDo=request.Reversar; } else if(action=="anular") { rule= Definiciones.CheckRequestBeforeAnular; operacion= Operaciones.Anular; factor=0; } else throw new HttpError(string.Format("Operacion:'{0}' NO implementada para ComprobanteEgreso", action )); var idUsuario = int.Parse(authSession.UserAuthId); factory.Execute(proxy=>{ using(proxy.AcquireLock(request.GetLockKey(), Definiciones.LockSeconds)) { ComprobanteEgreso oldData= DAL.GetComprobanteEgreso(proxy, request.Id); oldData.ValidateAndThrowHttpError(rule); oldData.AssertExists(request.Id); CheckBeforePatch(oldData, request, proxy, idUsuario, operacion); if(factor==0) { proxy.BeginDbTransaction(); request.Anular(proxy,"Anulado por Usuario"); proxy.CommitDbTransaction(); return; } List<ComprobanteEgresoItem> items = request.GetItems(proxy); proxy.BeginDbTransaction(); #region ActualizarCuentaPorPagar foreach(ComprobanteEgresoItem cei in items) { using (proxy.AcquireLock(cei.IdEgreso.GetLockKey<Egreso>(), Definiciones.LockSeconds)) { var egreso = DAL.GetEgresoById(proxy, cei.IdEgreso); if(operacion=="asentar") { var ece= new EgresoCE(){Egreso=egreso, Cei= cei}; var ecv= new EgresoCEValidator(); ecv.ValidateAndThrowHttpError(ece, Operaciones.ActualizarValorEgresoAlAsentarCE); } egreso.Saldo= egreso.Saldo-( cei.Abono*factor); egreso.ActualizarValorSaldo(proxy); var prs= DAL.GetPresupuestoActivo(proxy,request.IdSucursal,Definiciones.IdCentroGeneral); prs.AssertExistsActivo(request.IdSucursal, Definiciones.IdCentroGeneral); CodigoDocumento cd = proxy.GetCodigoDocumento(egreso.CodigoDocumento); cd.AssertExists(egreso.CodigoDocumento); cd.AssertEstaActivo(); //urn:PresupuestoItem:IdPresupuesto:{0}:Codigo:{1}" using(proxy.AcquireLock(prs.GetLockKey(cd.CodigoPresupuesto), Definiciones.LockSeconds)) { var pi= prs.GetPresupuestoItem(proxy,cd.CodigoPresupuesto); pi.AssertExists(prs.Id,cd.CodigoPresupuesto ); pi.UpdatePresupuesto(proxy,request.IdSucursal,Definiciones.IdCentroGeneral, request.Periodo, (cei.Abono>0?(short)1:(short)2), Math.Abs(cei.Abono)*factor,request.IdTercero); } var retList = cei.GetRetenciones(proxy); foreach(ComprobanteEgresoRetencion ret in retList) { using(proxy.AcquireLock(ret.IdPresupuestoItem.GetLockKey<PresupuestoItem>(), Definiciones.LockSeconds)) { var pi= DAL.GetPresupuestoItem(proxy,ret.IdPresupuestoItem); pi.AssertExists(ret.IdPresupuestoItem); pi.UpdatePresupuesto(proxy, request.IdSucursal, Definiciones.IdCentroGeneral,request.Periodo, (ret.Valor>0?(short)2:(short)1), Math.Abs(ret.Valor)*factor, null); } } } } //Actualizar Valor en Comprobante Egreso NO // Actualizar el presupuesto_item de la cuenta giradora.... using(proxy.AcquireLock(request.IdCuentaGiradora.GetLockKey<PresupuestoItem>(), Definiciones.LockSeconds)) { var pi= DAL.GetPresupuestoItem(proxy,request.IdCuentaGiradora); pi.AssertExists(request.IdCuentaGiradora); pi.UpdatePresupuesto(proxy, request.IdSucursal, Definiciones.IdCentroGeneral,request.Periodo, (request.Valor>0?(short)2:(short)1), request.Valor*factor, request.IdTerceroGiradora); } //} #endregion ActualizarCuentaPorPagar toDo(proxy); proxy.CommitDbTransaction(); } }); List<ComprobanteEgreso> data = new List<ComprobanteEgreso>(); data.Add(request); return new Response<ComprobanteEgreso>(){ Data=data }; }
static void ValidateAndThrowHttpError(this ComprobanteEgresoItem request, ComprobanteEgresoItem oldData, ComprobanteEgreso comprobante, Egreso egreso,string ruleSet) { EgresoCE ece= new EgresoCE(){ Egreso=egreso, Ce= comprobante, Cei= request, OldCei= oldData, }; EgresoCEValidator av = new EgresoCEValidator(); av.ValidateAndThrowHttpError(ece,ruleSet ); }