Use proper decimal arithmetic to compute price and vat
This commit is contained in:
		
					parent
					
						
							
								c92bf30514
							
						
					
				
			
			
				commit
				
					
						85b8c50ef1
					
				
			
		
					 1 changed files with 21 additions and 13 deletions
				
			
		| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
 | 
					import decimal
 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
from oca.pool import WrongIdError
 | 
					from oca.pool import WrongIdError
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -72,13 +73,16 @@ def get_vm_price(cpu, memory, disk_size, hdd_size=0, pricing_name='default'):
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        return None
 | 
					        return None
 | 
				
			||||||
    return ((cpu * pricing.cores_unit_price) +
 | 
					    price = ((decimal.Decimal(cpu) * pricing.cores_unit_price) +
 | 
				
			||||||
            (memory * pricing.ram_unit_price) +
 | 
					            (decimal.Decimal(memory) * pricing.ram_unit_price) +
 | 
				
			||||||
            (disk_size * pricing.ssd_unit_price) +
 | 
					            (decimal.Decimal(disk_size) * pricing.ssd_unit_price) +
 | 
				
			||||||
            (hdd_size * pricing.hdd_unit_price))
 | 
					            (decimal.Decimal(hdd_size) * pricing.hdd_unit_price))
 | 
				
			||||||
 | 
					    cents = decimal.Decimal('.01')
 | 
				
			||||||
 | 
					    price = price.quantize(cents, decimal.ROUND_HALF_UP)
 | 
				
			||||||
 | 
					    return float(price)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_vm_price_with_vat(cpu, memory, disk_size, hdd_size=0,
 | 
					def get_vm_price_with_vat(cpu, memory, ssd_size, hdd_size=0,
 | 
				
			||||||
                          pricing_name='default'):
 | 
					                          pricing_name='default'):
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    A helper function that computes price of a VM from given cpu, ram and
 | 
					    A helper function that computes price of a VM from given cpu, ram and
 | 
				
			||||||
| 
						 | 
					@ -86,7 +90,7 @@ def get_vm_price_with_vat(cpu, memory, disk_size, hdd_size=0,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    :param cpu: Number of cores of the VM
 | 
					    :param cpu: Number of cores of the VM
 | 
				
			||||||
    :param memory: RAM of the VM
 | 
					    :param memory: RAM of the VM
 | 
				
			||||||
    :param disk_size: Disk space of the VM (SSD)
 | 
					    :param ssd_size: Disk space of the VM (SSD)
 | 
				
			||||||
    :param hdd_size: The HDD size
 | 
					    :param hdd_size: The HDD size
 | 
				
			||||||
    :param pricing_name: The pricing name to be used
 | 
					    :param pricing_name: The pricing name to be used
 | 
				
			||||||
    :return: The a tuple containing the price of the VM and the VAT
 | 
					    :return: The a tuple containing the price of the VM and the VAT
 | 
				
			||||||
| 
						 | 
					@ -102,12 +106,16 @@ def get_vm_price_with_vat(cpu, memory, disk_size, hdd_size=0,
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        return None
 | 
					        return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    price = float((cpu * pricing.cores_unit_price) +
 | 
					    price = ((decimal.Decimal(cpu) * pricing.cores_unit_price) +
 | 
				
			||||||
             (memory * pricing.ram_unit_price) +
 | 
					             (decimal.Decimal(memory) * pricing.ram_unit_price) +
 | 
				
			||||||
             (disk_size * pricing.ssd_unit_price) +
 | 
					             (decimal.Decimal(ssd_size) * pricing.ssd_unit_price) +
 | 
				
			||||||
             (hdd_size * pricing.hdd_unit_price))
 | 
					             (decimal.Decimal(hdd_size) * pricing.hdd_unit_price))
 | 
				
			||||||
    if pricing.vat_inclusive:
 | 
					    if pricing.vat_inclusive:
 | 
				
			||||||
        vat = 0
 | 
					        vat = decimal.Decimal(0)
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        vat = price * float(pricing.vat_percentage) * 0.01
 | 
					        vat = price * pricing.vat_percentage * decimal.Decimal(0.01)
 | 
				
			||||||
    return price, vat
 | 
					
 | 
				
			||||||
 | 
					    cents = decimal.Decimal('.01')
 | 
				
			||||||
 | 
					    price = price.quantize(cents, decimal.ROUND_HALF_UP)
 | 
				
			||||||
 | 
					    vat = vat.quantize(cents, decimal.ROUND_HALF_UP)
 | 
				
			||||||
 | 
					    return float(price), float(vat)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue