Alex, vamos por partes:
Primeiro, se vc está desenvolvendo um sistema fiscal, leia os manuais do portal NF-e, principalmente o manual de orientação de preenchimento e
o manual de orientação ao contribuinte. Eu falo isso pq para a receita, os dados informados na NF-e são de responsabilidade 1-do proprietário da empresa;
2-do contador responsável; 3-do programador responsável pelo sistema. O PyNFe é apenas uma interface de comunicação com a receita, os dados informados serão sempre da sua responsabilidade. Para a SEFAZ, emitir NF-e com informações incorretas por falta de conhecimento, não te exime da responsabilidade e de uma possível punição.
A SEFAZ pode multar por cada NF-e emitida com valores incorretos, fora isso a empresa ainda pode ser multada por sonegação fiscal caso esteja enviado produtos fora da devida classificação (por exemplo, uma classificação com aliquota de imposto menor do que deveria).
Então fique alerta pq existe muito informação errada na internet, não se baseie apenas em informações de fóruns ou blogs, procure a documentação ou legislação que rege sobre a informação que vc precisa.
Não use informação sobre "dados de um produto qualquer que seja válido, só para este teste funcionar em homologação?".
A fase de homologação é importante justamente para vc informar dados reais sobre produtos e verificar junto a SEFAZ e o contador responsável pela empresa se o preenchimento está correto, se as informações estão com valores adequados.
Antes do seu sistema emitir notas de produção, sua empresa ou empresa onde trabalha vai precisar fazer um registro do software para ser um autorizador de NF-e junto a SEFAZ e será necessário "autorizar" a utilização desse software para cada empresa cliente que possuir.
Estou de falando isso como um amigo para te deixar ciente das responsabilidades de desenvolver um sistema fiscal.
Agora sobre o erro informado:
vc está informado icms_modalidade=102 e icms_csosn=400
Só para vc entender:
icms_modalidade=
ICMS_TIPOS_TRIBUTACAO = (
('00', 'ICMS 00 - Tributada integralmente'),
('10', 'ICMS 10 - Tributada com cobranca do ICMS por substituicao tributaria'),
('20', 'ICMS 20 - Com reducao da base de calculo'),
('30', 'ICMS 30 - Isenta ou nao tributada e com cobranca do ICMS por substituicao tributaria'),
('40', 'ICMS 40 - Isenta'),
('41', 'ICMS 41 - Nao tributada'),
('50', 'ICMS 50 - Suspensao'),
('51', 'ICMS 51 - Diferimento'),
('60', 'ICMS 60 - Cobrado anteriormente por substituicao tributaria'),
('70', 'ICMS 70 - Com reducao da base de calculo e cobranca do ICMS por substituicao tributaria'),
('90', 'ICMS 90 - Outras'),
('101', 'ICMS 101 - Tributação ICMS pelo Simples Nacional, CSOSN=101'),
('102', 'ICMS 102 - Tributação ICMS pelo Simples Nacional, CSOSN=102, 103, 300 ou 400'),
('201', 'ICMS 201 - Tributação ICMS pelo Simples Nacional, CSOSN=201'),
('202', 'ICMS 202 - Tributação ICMS pelo Simples Nacional, CSOSN=202 ou 203'),
('500', 'ICMS 500 - Tributação ICMS pelo Simples Nacional, CSOSN=500'),
('900', 'ICMS 900 - Tributação ICMS pelo Simples Nacional, CSOSN=900'),
('ST', 'ICMS ST - Grupo de informação do ICMS ST devido para a UF de destino, nas operações interestaduais de produtos que tiveram retenção antecipada de ICMS por ST na UF do remetente. Repasse via Substituto Tributário.')
Então, se a empresa é simples e a modalidade se encaixa em 101, 102, 103, 300 ou 400 vc pode ter cson..
icms_csosn= (Código de Situação da
Operação – Simples Nacional)
101- Tributada pelo Simples Nacional com permissão de crédito. (v.2.0)
102- Tributada pelo Simples Nacional sem permissão de crédito.
103 – Isenção do ICMS no Simples Nacional para faixa de receita bruta.
300 – Imune.
400 – Não tributada pelo Simples Nacional (v.2.0)
Mas, para cada tipo de modalidade existe um grupo de tags específica para icms, no manual de integração do contribuinte pg 128 existe 12 grupos de modalidades.
Como vc mencionou que a empresa não é simples, então ela entra em algum desses grupos e não possui csosn e sim cst.
Geralmente empresas que não são do simples nacional são industrias, se for este o caso vc ainda tem o grupo de pis, cofins e ipi que são da tributação simples e tem seus grupos específicos, que também possuem milhares de combinações possíveis para serialização do xml.
O PyNFe provavelmente não tem a serialização completa ou atualizada se a modalidade/regime de tributação for muito específica, portanto para eu poder te ajudar para modificar a serialização, preciso de mais informações completas sobre o emitente e o tipo de produto que será adicionado na nota.
A forma mais fácil e rápida é pegar algum xml de NF-e autorizada que a empresa já possui. Caso vc não tenha, ou não tenha acesso a isso, será preciso entrar em contato com o contador responsável para verificar essas informações.
De uma olhada no PyNFe utils flags, mas ele está desatualizado:
Serialização do icms a partir da pg 128:
Documentação da NF-e
Por favor, esclareça melhor o tipo de sistema que está desenvolvendo, informações do tipo de empresa cliente e tipo do produto para que eu possa te ajudar da melhor forma possível.