Solución:
Como dijiste, 200 (en realidad todo el rango 200-299) es un código de país falso que indica que el número es un número interno. Eso significa que puede hacer el resto del número.
Un número EAN suele tener 13 dígitos, aunque también puede tener otras longitudes. Mantengámoslo en 13, ya que especificó el deseo de EAN13.
El decimotercer dígito es un dígito de control. Entonces, todo lo que tienes que hacer es realizar la misma validación pero con un giro. En lugar de calcular el dígito de control y validar si el último dígito coincide con el dígito de control, simplemente calcule el dígito de control y agréguelo a los 12 dígitos que ya tiene.
Realmente no he intentado modificar su código existente, ya que parece confuso y complejo, pero según las reglas de validación que encontré en Wikipedia, esto debería funcionar:
function generateEAN($number)
{
$code="200" . str_pad($number, 9, '0');
$weightflag = true;
$sum = 0;
// Weight for a digit in the checksum is 3, 1, 3.. starting from the last digit.
// loop backwards to make the loop length-agnostic. The same basic functionality
// will work for codes of different lengths.
for ($i = strlen($code) - 1; $i >= 0; $i--)
{
$sum += (int)$code[$i] * ($weightflag?3:1);
$weightflag = !$weightflag;
}
$code .= (10 - ($sum % 10)) % 10;
return $code;
}
$number
es el código interno que desea tener EAN. La función agrega el prefijo, el relleno de ceros y la suma de comprobación.