Main Calculations

This section defines the validation rules and calculations for receipt field values.

Validation rules and calculations for all the elements are as follows:

  1. seller.rin length must be 9 digits
  2. if buyer.type is [B], buyer.id length must be 9 digits
  3. if buyer.type is [P] and buyer.id is not null, buyer.id length must be 14 digits
  4. header.dateTimeIssued can’t be in the future
  5. itemData[*].quantity is a decimal number up to 5 decimal precisions
  6. itemData[*].unitPrice is a decimal number up to 5 decimal precisions
  7. itemData[*].unitPrice >= 0
  8. itemData[*].commercialDiscountData[*].amount >= 0
  9. totalCommercialDiscount <= totalSales
  10. itemData[*].totalSale is a decimal number up to 5 decimal precisions
  11. itemData[*].totalSale = itemData[*].quantity * itemData[*].unitPrice
  12. itemData[*].netSale is a decimal number up to 5 decimal precisions
  13. itemData[*].netSale = itemData[*].totalSale – Sum(itemData[*].commercialDiscountData[*].amount)- Sum (itemData[*].additionalCommercialDiscount.amount)
  14. itemData[*].valueDifference is a decimal number up to 5 decimal precisions
  15. itemData[*].itemDiscountData[*].amount is a decimal number up to 5 decimal precisions
  16. totalAmount is a decimal number up to 5 decimal precisions
  17. itemData[*].total = itemData[*].netSale + t3Amount [itemData[*].taxableItems[taxType=T3].amount] + TotalTaxableFees [Sum(itemData[*].taxableItems[taxType=T5-T12].amount)] + t2Amount [itemData[*].taxableItems[taxType=T2].amount] + t1Amount [itemData[*].taxableItems[taxType=T1].amount] - Sum(itemData[*].itemDiscountData[*].amount) - Sum(itemData[*].additionalItemDiscount.amount) - t4Amount [itemData[*].taxableItems[taxType=T4].amount] + NonTotalTaxableFees [Sum(itemData[*].taxableItems[taxType=T13-T20].amount)]
  18. totalSales is a decimal number up to 5 decimal precisions
  19. totalCommercialDiscount is a decimal number up to 5 decimal precisions
  20. netAmount is a decimal number up to 5 decimal precisions
  21. totalItemsDiscount is a decimal number up to 5 decimal precisions
  22. taxTotals[*].amount is a decimal number up to 5 decimal precisions
  23. totalSales = Sum (itemData[*].totalSale)
  24. totalCommercialDiscount = Sum (itemData[*].commercialDiscountData[*].amount) + Sum (itemData[*].additionalCommercialDiscount.amount)
  25. netAmount = Sum(itemData[*].netSale)
  26. taxTotals <taxType> = Sum (itemData[*].taxableItems[taxType=].amount)
  27. totalItemsDiscount = Sum (itemData[*].itemDiscountData[*].amount) + Sum (itemData[*].additionalItemDiscount.amount)
  28. extraReceiptDiscountData[*].amount is a decimal number up to 5 decimal precisions
  29. totalAmount = Sum (itemData[*].Total) - Sum (extraReceiptDiscountData[*].amount) + adjustment
  30. itemData[*].taxableItems[*].amount is a decimal number up to 5 decimal precisions
  31. if itemData[*].taxableItems[*].subType is not fixed, itemData[*].taxableItems[*].rate must be between 0 and 999
  32. if itemData[*].taxableItems[*].rate > 0, it is a decimal number up to 2 decimal precisions
  33. itemData[*].taxableItems[*].amount >= 0
  34. header.netWeight - pattern match to have decimal value with up to 5 decimal precision digits
  35. header.grossWeight - pattern match to have decimal value with up to 5 decimal precision digits
  36. if Channel = “ERP” OR Channel = “POS” and itemData[*].taxableItems[*].subType provided is fixed, then itemData[*].taxableItems[*].rate should be provided as zero or not provided at all
  37. if header.currency is not [EGP], header.exchangeRate is a decimal number up to 5 decimal precisions
  38. buyer.type is [B], seller.rin != buyer.id (can’t be the same)
  39. itemData[*].itemDiscountData[*].amount >= 0
  40. if itemData[*].taxableItems[*].taxtype=T2, then itemData[*].taxableItems[*].amount = (itemData[*].netSale + TotalTaxableFees [Sum(itemData[*].taxableItems[taxType=T5-T12].amount)] + itemData[*].valueDifference) * itemData[*].taxableItems[taxType=”T2”].rate / 100
  41. if itemData[*].taxableItems[*].taxtype=T3, then itemData[*].taxableItems[*].rate = 0 OR is not supplied (rate for this item should always be 0 as this if fixed amount item)
  42. if itemData[*].taxableItems[*].taxtype=T1, then itemData[*].taxableItems[*].amount = (itemData[*].taxableItems[taxType=”T2” <TableTaxPercentageT2>].amount + itemData[*].netSale + TotalTaxableFees [Sum(itemData[*].taxableItems[taxType=T5-T12].amount)] + itemData[*].valueDifference + itemData[*].taxableItems[taxType=”T3” <TableTaxFixedAmountT3>].amount) _ itemData[*].taxableItems[_ TaxableItem<T1>].Rate / 100
  43. itemData[*].total is a decimal number up to 5 decimal precisions
  44. if itemData[*].commercialDiscountData[*].rate>0, then itemData[*].commercialDiscountData[*].amount= itemData[*].commercialDiscountData[*].rate * itemData[*].totalSale/ 100
  45. if itemData[*].itemDiscountData[*].rate>0, then itemData[*].itemDiscountData[*].amount= itemData[*].itemDiscountData [*].rate * itemData[*].netSale / 100
  46. if itemData[*].additionalCommercialDiscount.rate>0, then itemData[*].additionalCommercialDiscount.amount= itemData[*].additionalCommercialDiscount .rate * (itemData[*].totalSale – Sum(itemData[*].commercialDiscount[*].amount))/ 100
  47. if itemData[*].additionalItemDiscount.rate>0, then itemData[*].additionalItemDiscount.amount= itemData[*].additionalItemDiscount.rate * (itemData[*].netSale – Sum(itemData[*].itemDiscountData[*].amount))/ 100
  48. if extraReceiptDiscountData[*].rate>0, then extraReceiptDiscountData[*].amount= extraReceiptDiscountData[*].rate * netAmount / 100

Note! • All the above calculations are subject to (± 0.5) tolerance.