def calcular_subtotal(self): """ Devuelve el subtotal de la factura: líneas de venta + servicios. No cuenta abonos, descuento global ni IVA. """ total_ldvs = sum([utils.ffloat((l.cantidad * l.precio) * (1 - l.descuento)) for l in self.lineasDeVenta]) total_srvs = sum([utils.ffloat((s.precio * s.cantidad) * (1 - s.descuento)) for s in self.servicios]) subtotal = total_ldvs + total_srvs return subtotal
def calcular_total_descuento(self, subtotal=None): """ Calcula el total del descuento global. """ if subtotal == None: subtotal = self.calcular_subtotal() tot_dto = utils.ffloat(-1 * (subtotal + float(self.cargo)) * self.descuento) return tot_dto
def calcular_total_irpf(self, subtotal = None, tot_dto = None, cargo = None, abonos = None): """ Calcula el importe total de retención de IRPF (se resta al total) de la factura. """ if subtotal == None: subtotal = self.calcular_subtotal() if tot_dto == None: tot_dto = self.calcular_total_descuento(subtotal) if cargo == None: cargo = self.cargo if abonos == None: abonos = sum([pa.importe for pa in self.pagosDeAbono]) total_irpf = utils.ffloat(subtotal + tot_dto + self.cargo + abonos) * self.irpf return total_irpf
def calcular_total_iva(self, subtotal=None, tot_dto=None, cargo=None, abonos=None): """ Calcula el importe total de IVA de la factura. """ if subtotal == None: subtotal = self.calcular_subtotal() if tot_dto == None: tot_dto = self.calcular_total_descuento(subtotal) if cargo == None: cargo = self.cargo if abonos == None: abonos = sum([pa.importe for pa in self.pagosDeAbono]) total_iva = utils.ffloat( subtotal + tot_dto + cargo + abonos) * self.iva return total_iva
def calcular_total_irpf(self, subtotal = None, tot_dto = None, cargo = None, abonos = None): """ Calcula el importe total de retención de IRPF (se resta al total) de la factura. Se devuelve en positivo (aunque en realidad sea una cantidad negativa a sumar al total). """ if self.irpf != 0: if subtotal == None: subtotal = self.calcular_subtotal() if tot_dto == None: tot_dto = self.calcular_total_descuento(subtotal) if cargo == None: cargo = self.cargo if abonos == None: abonos = sum([pa.importe for pa in self.pagosDeAbono]) total_irpf = utils.ffloat(subtotal + tot_dto + self.cargo + abonos) * self.irpf else: total_irpf = 0.0 return total_irpf
def _calcular_total_iva(self, subtotal=None, tot_dto=None, cargo=None, abonos=None): """ Calcula el importe total de IVA de la factura. """ if subtotal == None: #subtotal = self.calcular_subtotal() subtotal = float(self.calcular_base_imponible()) if tot_dto == None: tot_dto = float(self.calcular_total_descuento(subtotal)) # Porque viene como FixedPoint y todas las operaciones en total_iva # se "castean" a FixedPoint, redondeando mal con, por ejemplo: # 18562.5 * 0.21 if cargo == None: cargo = float(self.cargo) # Es Decimal y no puede operar con floats if abonos == None: abonos = sum([pa.importe for pa in self.pagosDeAbono]) total_iva = utils.ffloat(( subtotal + tot_dto + cargo + abonos) * self.iva) return total_iva