Functional Weave
Code in TypeScript

agri.milk-price@1.0.0

vectors.json

17,215 bytes · view raw

[
  {
    "name": "September, good constituents, middle volume tier: 40.100 ppl on 750,000 litres is £300,750",
    "args": [
      {
        "currency": "GBP",
        "basePrice": 38000,
        "standardButterfatBasisPoints": 400,
        "butterfatValue": 250,
        "standardProteinBasisPoints": 330,
        "proteinValue": 400,
        "volumeBonuses": [
          {
            "minimumLitres": 500000,
            "bonus": 200
          },
          {
            "minimumLitres": 1000000,
            "bonus": 400
          }
        ],
        "seasonality": [
          0,
          0,
          0,
          -1000,
          -1500,
          -1000,
          0,
          500,
          1000,
          1000,
          500,
          0
        ]
      },
      {
        "litres": 750000,
        "butterfatBasisPoints": 420,
        "proteinBasisPoints": 340,
        "month": 9
      }
    ],
    "expect": {
      "basePrice": 38000,
      "butterfatAdjustment": 500,
      "proteinAdjustment": 400,
      "volumeBonus": 200,
      "seasonalAdjustment": 1000,
      "pricePerLitre": 40100,
      "total": {
        "minor": 30075000,
        "currency": "GBP"
      }
    }
  },
  {
    "name": "May spring flush with low constituents on the top volume tier",
    "args": [
      {
        "currency": "GBP",
        "basePrice": 38000,
        "standardButterfatBasisPoints": 400,
        "butterfatValue": 250,
        "standardProteinBasisPoints": 330,
        "proteinValue": 400,
        "volumeBonuses": [
          {
            "minimumLitres": 500000,
            "bonus": 200
          },
          {
            "minimumLitres": 1000000,
            "bonus": 400
          }
        ],
        "seasonality": [
          0,
          0,
          0,
          -1000,
          -1500,
          -1000,
          0,
          500,
          1000,
          1000,
          500,
          0
        ]
      },
      {
        "litres": 1200000,
        "butterfatBasisPoints": 385,
        "proteinBasisPoints": 322,
        "month": 5
      }
    ],
    "expect": {
      "basePrice": 38000,
      "butterfatAdjustment": -375,
      "proteinAdjustment": -320,
      "volumeBonus": 400,
      "seasonalAdjustment": -1500,
      "pricePerLitre": 36205,
      "total": {
        "minor": 43446000,
        "currency": "GBP"
      }
    }
  },
  {
    "name": "a pro-rata butterfat adjustment of 76.5 thousandths rounds up to 77",
    "args": [
      {
        "currency": "GBP",
        "basePrice": 30000,
        "standardButterfatBasisPoints": 400,
        "butterfatValue": 255,
        "standardProteinBasisPoints": 330,
        "proteinValue": 0,
        "volumeBonuses": [],
        "seasonality": []
      },
      {
        "litres": 1000,
        "butterfatBasisPoints": 403,
        "proteinBasisPoints": 330,
        "month": 1
      }
    ],
    "expect": {
      "basePrice": 30000,
      "butterfatAdjustment": 77,
      "proteinAdjustment": 0,
      "volumeBonus": 0,
      "seasonalAdjustment": 0,
      "pricePerLitre": 30077,
      "total": {
        "minor": 30077,
        "currency": "GBP"
      }
    }
  },
  {
    "name": "below standard it rounds away from zero, to -77",
    "args": [
      {
        "currency": "GBP",
        "basePrice": 30000,
        "standardButterfatBasisPoints": 400,
        "butterfatValue": 255,
        "standardProteinBasisPoints": 330,
        "proteinValue": 0,
        "volumeBonuses": [],
        "seasonality": []
      },
      {
        "litres": 1000,
        "butterfatBasisPoints": 397,
        "proteinBasisPoints": 330,
        "month": 1
      }
    ],
    "expect": {
      "basePrice": 30000,
      "butterfatAdjustment": -77,
      "proteinAdjustment": 0,
      "volumeBonus": 0,
      "seasonalAdjustment": 0,
      "pricePerLitre": 29923,
      "total": {
        "minor": 29923,
        "currency": "GBP"
      }
    }
  },
  {
    "name": "the payment is rounded once: 333 litres at 39.900 ppl is 13,286.7p",
    "args": [
      {
        "currency": "GBP",
        "basePrice": 38000,
        "standardButterfatBasisPoints": 400,
        "butterfatValue": 250,
        "standardProteinBasisPoints": 330,
        "proteinValue": 400,
        "volumeBonuses": [
          {
            "minimumLitres": 500000,
            "bonus": 200
          },
          {
            "minimumLitres": 1000000,
            "bonus": 400
          }
        ],
        "seasonality": [
          0,
          0,
          0,
          -1000,
          -1500,
          -1000,
          0,
          500,
          1000,
          1000,
          500,
          0
        ]
      },
      {
        "litres": 333,
        "butterfatBasisPoints": 420,
        "proteinBasisPoints": 340,
        "month": 9
      }
    ],
    "expect": {
      "basePrice": 38000,
      "butterfatAdjustment": 500,
      "proteinAdjustment": 400,
      "volumeBonus": 0,
      "seasonalAdjustment": 1000,
      "pricePerLitre": 39900,
      "total": {
        "minor": 13287,
        "currency": "GBP"
      }
    }
  },
  {
    "name": "the payment rounds half up: 5 litres at 30.100 ppl is 150.5p, paid as 151p",
    "args": [
      {
        "currency": "GBP",
        "basePrice": 30100,
        "standardButterfatBasisPoints": 400,
        "butterfatValue": 0,
        "standardProteinBasisPoints": 330,
        "proteinValue": 0,
        "volumeBonuses": [],
        "seasonality": []
      },
      {
        "litres": 5,
        "butterfatBasisPoints": 400,
        "proteinBasisPoints": 330,
        "month": 1
      }
    ],
    "expect": {
      "basePrice": 30100,
      "butterfatAdjustment": 0,
      "proteinAdjustment": 0,
      "volumeBonus": 0,
      "seasonalAdjustment": 0,
      "pricePerLitre": 30100,
      "total": {
        "minor": 151,
        "currency": "GBP"
      }
    }
  },
  {
    "name": "a volume tier starts at exactly its minimum",
    "args": [
      {
        "currency": "GBP",
        "basePrice": 38000,
        "standardButterfatBasisPoints": 400,
        "butterfatValue": 250,
        "standardProteinBasisPoints": 330,
        "proteinValue": 400,
        "volumeBonuses": [
          {
            "minimumLitres": 500000,
            "bonus": 200
          },
          {
            "minimumLitres": 1000000,
            "bonus": 400
          }
        ],
        "seasonality": [
          0,
          0,
          0,
          -1000,
          -1500,
          -1000,
          0,
          500,
          1000,
          1000,
          500,
          0
        ]
      },
      {
        "litres": 500000,
        "butterfatBasisPoints": 400,
        "proteinBasisPoints": 330,
        "month": 1
      }
    ],
    "expect": {
      "basePrice": 38000,
      "butterfatAdjustment": 0,
      "proteinAdjustment": 0,
      "volumeBonus": 200,
      "seasonalAdjustment": 0,
      "pricePerLitre": 38200,
      "total": {
        "minor": 19100000,
        "currency": "GBP"
      }
    }
  },
  {
    "name": "one litre short of a tier gets nothing",
    "args": [
      {
        "currency": "GBP",
        "basePrice": 38000,
        "standardButterfatBasisPoints": 400,
        "butterfatValue": 250,
        "standardProteinBasisPoints": 330,
        "proteinValue": 400,
        "volumeBonuses": [
          {
            "minimumLitres": 500000,
            "bonus": 200
          },
          {
            "minimumLitres": 1000000,
            "bonus": 400
          }
        ],
        "seasonality": [
          0,
          0,
          0,
          -1000,
          -1500,
          -1000,
          0,
          500,
          1000,
          1000,
          500,
          0
        ]
      },
      {
        "litres": 499999,
        "butterfatBasisPoints": 400,
        "proteinBasisPoints": 330,
        "month": 1
      }
    ],
    "expect": {
      "basePrice": 38000,
      "butterfatAdjustment": 0,
      "proteinAdjustment": 0,
      "volumeBonus": 0,
      "seasonalAdjustment": 0,
      "pricePerLitre": 38000,
      "total": {
        "minor": 18999962,
        "currency": "GBP"
      }
    }
  },
  {
    "name": "December uses the last seasonal value",
    "args": [
      {
        "currency": "GBP",
        "basePrice": 38000,
        "standardButterfatBasisPoints": 400,
        "butterfatValue": 250,
        "standardProteinBasisPoints": 330,
        "proteinValue": 400,
        "volumeBonuses": [
          {
            "minimumLitres": 500000,
            "bonus": 200
          },
          {
            "minimumLitres": 1000000,
            "bonus": 400
          }
        ],
        "seasonality": [
          0,
          0,
          0,
          -1000,
          -1500,
          -1000,
          0,
          500,
          1000,
          1000,
          500,
          0
        ]
      },
      {
        "litres": 100000,
        "butterfatBasisPoints": 400,
        "proteinBasisPoints": 330,
        "month": 12
      }
    ],
    "expect": {
      "basePrice": 38000,
      "butterfatAdjustment": 0,
      "proteinAdjustment": 0,
      "volumeBonus": 0,
      "seasonalAdjustment": 0,
      "pricePerLitre": 38000,
      "total": {
        "minor": 3800000,
        "currency": "GBP"
      }
    }
  },
  {
    "name": "no milk is no payment",
    "args": [
      {
        "currency": "GBP",
        "basePrice": 38000,
        "standardButterfatBasisPoints": 400,
        "butterfatValue": 250,
        "standardProteinBasisPoints": 330,
        "proteinValue": 400,
        "volumeBonuses": [
          {
            "minimumLitres": 500000,
            "bonus": 200
          },
          {
            "minimumLitres": 1000000,
            "bonus": 400
          }
        ],
        "seasonality": [
          0,
          0,
          0,
          -1000,
          -1500,
          -1000,
          0,
          500,
          1000,
          1000,
          500,
          0
        ]
      },
      {
        "litres": 0,
        "butterfatBasisPoints": 400,
        "proteinBasisPoints": 330,
        "month": 4
      }
    ],
    "expect": {
      "basePrice": 38000,
      "butterfatAdjustment": 0,
      "proteinAdjustment": 0,
      "volumeBonus": 0,
      "seasonalAdjustment": -1000,
      "pricePerLitre": 37000,
      "total": {
        "minor": 0,
        "currency": "GBP"
      }
    }
  },
  {
    "name": "a euro contract in cents",
    "args": [
      {
        "currency": "EUR",
        "basePrice": 45000,
        "standardButterfatBasisPoints": 400,
        "butterfatValue": 300,
        "standardProteinBasisPoints": 330,
        "proteinValue": 500,
        "volumeBonuses": [],
        "seasonality": []
      },
      {
        "litres": 20000,
        "butterfatBasisPoints": 450,
        "proteinBasisPoints": 350,
        "month": 6
      }
    ],
    "expect": {
      "basePrice": 45000,
      "butterfatAdjustment": 1500,
      "proteinAdjustment": 1000,
      "volumeBonus": 0,
      "seasonalAdjustment": 0,
      "pricePerLitre": 47500,
      "total": {
        "minor": 950000,
        "currency": "EUR"
      }
    }
  },
  {
    "name": "a seasonality list that is not 12 long is an error",
    "args": [
      {
        "currency": "GBP",
        "basePrice": 38000,
        "standardButterfatBasisPoints": 400,
        "butterfatValue": 250,
        "standardProteinBasisPoints": 330,
        "proteinValue": 400,
        "volumeBonuses": [
          {
            "minimumLitres": 500000,
            "bonus": 200
          },
          {
            "minimumLitres": 1000000,
            "bonus": 400
          }
        ],
        "seasonality": [
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0
        ]
      },
      {
        "litres": 1000,
        "butterfatBasisPoints": 400,
        "proteinBasisPoints": 330,
        "month": 1
      }
    ],
    "expectError": "seasonality must have 12 monthly values or none"
  },
  {
    "name": "month 13 is an error",
    "args": [
      {
        "currency": "GBP",
        "basePrice": 38000,
        "standardButterfatBasisPoints": 400,
        "butterfatValue": 250,
        "standardProteinBasisPoints": 330,
        "proteinValue": 400,
        "volumeBonuses": [
          {
            "minimumLitres": 500000,
            "bonus": 200
          },
          {
            "minimumLitres": 1000000,
            "bonus": 400
          }
        ],
        "seasonality": [
          0,
          0,
          0,
          -1000,
          -1500,
          -1000,
          0,
          500,
          1000,
          1000,
          500,
          0
        ]
      },
      {
        "litres": 1000,
        "butterfatBasisPoints": 400,
        "proteinBasisPoints": 330,
        "month": 13
      }
    ],
    "expectError": "month must be a whole number from 1 to 12"
  },
  {
    "name": "volume tiers out of order are an error",
    "args": [
      {
        "currency": "GBP",
        "basePrice": 38000,
        "standardButterfatBasisPoints": 400,
        "butterfatValue": 250,
        "standardProteinBasisPoints": 330,
        "proteinValue": 400,
        "volumeBonuses": [
          {
            "minimumLitres": 1000000,
            "bonus": 400
          },
          {
            "minimumLitres": 500000,
            "bonus": 200
          }
        ],
        "seasonality": [
          0,
          0,
          0,
          -1000,
          -1500,
          -1000,
          0,
          500,
          1000,
          1000,
          500,
          0
        ]
      },
      {
        "litres": 1000,
        "butterfatBasisPoints": 400,
        "proteinBasisPoints": 330,
        "month": 1
      }
    ],
    "expectError": "volumeBonuses must be in strictly ascending order of minimumLitres"
  },
  {
    "name": "negative litres are an error",
    "args": [
      {
        "currency": "GBP",
        "basePrice": 38000,
        "standardButterfatBasisPoints": 400,
        "butterfatValue": 250,
        "standardProteinBasisPoints": 330,
        "proteinValue": 400,
        "volumeBonuses": [
          {
            "minimumLitres": 500000,
            "bonus": 200
          },
          {
            "minimumLitres": 1000000,
            "bonus": 400
          }
        ],
        "seasonality": [
          0,
          0,
          0,
          -1000,
          -1500,
          -1000,
          0,
          500,
          1000,
          1000,
          500,
          0
        ]
      },
      {
        "litres": -1,
        "butterfatBasisPoints": 400,
        "proteinBasisPoints": 330,
        "month": 1
      }
    ],
    "expectError": "litres must be a whole number from 0 to 1000000000"
  },
  {
    "name": "butterfat given as a percentage is an error",
    "args": [
      {
        "currency": "GBP",
        "basePrice": 38000,
        "standardButterfatBasisPoints": 400,
        "butterfatValue": 250,
        "standardProteinBasisPoints": 330,
        "proteinValue": 400,
        "volumeBonuses": [
          {
            "minimumLitres": 500000,
            "bonus": 200
          },
          {
            "minimumLitres": 1000000,
            "bonus": 400
          }
        ],
        "seasonality": [
          0,
          0,
          0,
          -1000,
          -1500,
          -1000,
          0,
          500,
          1000,
          1000,
          500,
          0
        ]
      },
      {
        "litres": 1000,
        "butterfatBasisPoints": 4.12,
        "proteinBasisPoints": 330,
        "month": 1
      }
    ],
    "expectError": "butterfatBasisPoints must be a whole number"
  },
  {
    "name": "a price that goes negative is an error",
    "args": [
      {
        "currency": "GBP",
        "basePrice": 1000,
        "standardButterfatBasisPoints": 400,
        "butterfatValue": 1000,
        "standardProteinBasisPoints": 330,
        "proteinValue": 0,
        "volumeBonuses": [],
        "seasonality": []
      },
      {
        "litres": 1000,
        "butterfatBasisPoints": 300,
        "proteinBasisPoints": 330,
        "month": 1
      }
    ],
    "expectError": "price per litre must not be negative"
  },
  {
    "name": "a bad currency code is an error",
    "args": [
      {
        "currency": "gbp",
        "basePrice": 38000,
        "standardButterfatBasisPoints": 400,
        "butterfatValue": 250,
        "standardProteinBasisPoints": 330,
        "proteinValue": 400,
        "volumeBonuses": [
          {
            "minimumLitres": 500000,
            "bonus": 200
          },
          {
            "minimumLitres": 1000000,
            "bonus": 400
          }
        ],
        "seasonality": [
          0,
          0,
          0,
          -1000,
          -1500,
          -1000,
          0,
          500,
          1000,
          1000,
          500,
          0
        ]
      },
      {
        "litres": 1000,
        "butterfatBasisPoints": 400,
        "proteinBasisPoints": 330,
        "month": 1
      }
    ],
    "expectError": "is not an uppercase ISO 4217 currency code"
  }
]