endi.plugins.sap_urssaf3p package¶
Subpackages¶
- endi.plugins.sap_urssaf3p.forms package
- endi.plugins.sap_urssaf3p.models package
- Subpackages
- Submodules
- endi.plugins.sap_urssaf3p.models.customer module
UrssafCustomerDataUrssafCustomerData.bank_account_bicUrssafCustomerData.bank_account_ibanUrssafCustomerData.bank_account_ownerUrssafCustomerData.birth_nameUrssafCustomerData.birthdateUrssafCustomerData.birthplace_cityUrssafCustomerData.birthplace_city_codeUrssafCustomerData.birthplace_countryUrssafCustomerData.birthplace_country_codeUrssafCustomerData.birthplace_departmentUrssafCustomerData.birthplace_department_codeUrssafCustomerData.client_idUrssafCustomerData.customerUrssafCustomerData.customer_idUrssafCustomerData.get_status()UrssafCustomerData.idUrssafCustomerData.lieu_ditUrssafCustomerData.registration_statusUrssafCustomerData.street_nameUrssafCustomerData.street_numberUrssafCustomerData.street_number_complementUrssafCustomerData.street_type
UrssafCustomerRegistrationStatusUrssafCustomerRegistrationStatus.childrenUrssafCustomerRegistrationStatus.commentUrssafCustomerRegistrationStatus.created_atUrssafCustomerRegistrationStatus.dataUrssafCustomerRegistrationStatus.data_idUrssafCustomerRegistrationStatus.file_requirementsUrssafCustomerRegistrationStatus.filesUrssafCustomerRegistrationStatus.idUrssafCustomerRegistrationStatus.nameUrssafCustomerRegistrationStatus.parentUrssafCustomerRegistrationStatus.parent_idUrssafCustomerRegistrationStatus.statusUrssafCustomerRegistrationStatus.status_dateUrssafCustomerRegistrationStatus.statusesUrssafCustomerRegistrationStatus.type_UrssafCustomerRegistrationStatus.updated_atUrssafCustomerRegistrationStatus.urssaf3p_registration_status_historyUrssafCustomerRegistrationStatus.userUrssafCustomerRegistrationStatus.user_id
UrssafSubscribeStatusMixin
- endi.plugins.sap_urssaf3p.models.payment_request module
PaymentRequestStatusHolderMiximPaymentRequestStatusHolderMixim.ALL_STATUSESPaymentRequestStatusHolderMixim.FINAL_STATUSESPaymentRequestStatusHolderMixim.LOG_ENTRY_MAPPINGPaymentRequestStatusHolderMixim.STATUS_ABORTEDPaymentRequestStatusHolderMixim.STATUS_ERRORPaymentRequestStatusHolderMixim.STATUS_PAYMENT_ISSUEPaymentRequestStatusHolderMixim.STATUS_RESULTEDPaymentRequestStatusHolderMixim.STATUS_WAITINGPaymentRequestStatusHolderMixim.request_commentPaymentRequestStatusHolderMixim.request_statusPaymentRequestStatusHolderMixim.request_status_userPaymentRequestStatusHolderMixim.request_status_user_idPaymentRequestStatusHolderMixim.urssaf3p_request_status_history
URSSAFPaymentRequestURSSAFPaymentRequest.childrenURSSAFPaymentRequest.created_atURSSAFPaymentRequest.file_requirementsURSSAFPaymentRequest.filesURSSAFPaymentRequest.get_by_urssaf_id()URSSAFPaymentRequest.idURSSAFPaymentRequest.invoiceURSSAFPaymentRequest.nameURSSAFPaymentRequest.parentURSSAFPaymentRequest.parent_idURSSAFPaymentRequest.request_commentURSSAFPaymentRequest.request_statusURSSAFPaymentRequest.request_status_userURSSAFPaymentRequest.request_status_user_idURSSAFPaymentRequest.should_watchURSSAFPaymentRequest.statusesURSSAFPaymentRequest.type_URSSAFPaymentRequest.update_from_reject_data()URSSAFPaymentRequest.update_from_transfer_data()URSSAFPaymentRequest.update_from_urssaf_status_code()URSSAFPaymentRequest.updated_atURSSAFPaymentRequest.urssaf3p_request_status_historyURSSAFPaymentRequest.urssaf_idURSSAFPaymentRequest.urssaf_reject_messageURSSAFPaymentRequest.urssaf_status_codeURSSAFPaymentRequest.urssaf_status_descriptionURSSAFPaymentRequest.urssaf_status_titleURSSAFPaymentRequest.urssaf_transfer_message
on_set_update_updated_at()start_listening()
- Module contents
- endi.plugins.sap_urssaf3p.views package
Submodules¶
endi.plugins.sap_urssaf3p.api_client module¶
- exception endi.plugins.sap_urssaf3p.api_client.HTTPBadRequest(errors: Optional[List[dict]])¶
Bases :
PermanentError400 error, specialized for URSSAF way of returning structured errors
- FALLBACK_ERROR = {'code': 'ERR_UNKNOWN', 'description': "L'URSSAF n'a pas fourni de détail d'erreur", 'message': 'Erreur inconnue'}¶
- exception endi.plugins.sap_urssaf3p.api_client.PermanentError¶
Bases :
APIErrorAn API error that is unlikely to succeed without code/config change.
- exception endi.plugins.sap_urssaf3p.api_client.TemporaryError¶
Bases :
APIErrorAn API error that may worth a retry
- class endi.plugins.sap_urssaf3p.api_client.URSSAF3PClient(api_url)¶
Bases :
objectThin API client for API « tiers de paiement » from URSSAF
Are handled : - statefull auth (oauth) - systematic logging of requests and responses (at debug loglevel, except for auth requests) - catching of network and API errors
Are not handled : - Bearer token expiration (qui dure 1h) - Multiple error returned (in case of 400 error)
- authorize(client_id, client_secret) Optional[str]¶
- Paramètres:
client_id –
client_secret –
- Renvoie:
None if the auth was unsuccessful
- consulter_demandes(start_date: Optional[datetime] = None, end_date: Optional[datetime] = None, id_demandes: Optional[list] = None) dict¶
Ce service permet, pour un tiers de prestation authentifié, de récupérer les informations des demandes de paiement qui ont été enregistrées.
La recherche s’effectue par les identifiants de demandes de paiement ou par la période de facturation. Dans le cas où les identifiants de demandes de paiement et la période sont renseignées, la recherche ne s’effectuera que sur les identifiants. Ce service permet de récupérer un maximum de 10 statuts de demandes de paiement par appel.
(description source: URSSAF, Documentation-API-TiersPrestation_v1-1-7.pdf)
- Paramètres:
start_date – min invoice date
end_date – max invoice date
id_demandes – max 10 of urssaf-generated IDs we want to query
- Renvoie:
- inscrire_client(payload: dict) str¶
If sucessful, returns the id, else raise an error
- Renvoie:
the URSSAF ID of the client.
- endi.plugins.sap_urssaf3p.api_client.get_urssaf_api_client(registry_settings: dict) URSSAF3PClient¶
Renvoie une instance du client d’api connectée
- Paramètres:
registry_settings – La configuration de l’instance (fichier .ini),
habituellement récupérée par : request.registry.settings
>>> client = get_urssaf_api_client(registry_settings) >>> id_client = client.inscrire_client(client_au_format_urssaf)
endi.plugins.sap_urssaf3p.celery_jobs module¶
endi.plugins.sap_urssaf3p.endi_admin_commands module¶
- class endi.plugins.sap_urssaf3p.endi_admin_commands.CheckUrssaf3pCommand¶
Bases :
AbstractCommandChecks that URSSAF tiers de paiement feature is well configured
- classmethod check_config(ini_settings)¶
- classmethod check_oauth(client, client_id, client_secret)¶
- classmethod check_products()¶
Checks that at least one product is offered with a code_nature urssaf
- classmethod check_test_request(client)¶
- name = 'check_urssaf3p'¶
- class endi.plugins.sap_urssaf3p.endi_admin_commands.GetCustomerPayload¶
Bases :
AbstractCommandReturn serialized data for given customer
- classmethod add_arguments(parser) None¶
Adds arguments to the subcmd parser
no-op if no special arguments is used for the subcmd
- Paramètres:
parser – the sub-command parser already added to main CMD subparsers
- name = 'get_urssaf3p_customer_payload'¶
- class endi.plugins.sap_urssaf3p.endi_admin_commands.GetInvoicePayload¶
Bases :
AbstractCommandReturn serialized data for given invoice
- classmethod add_arguments(parser) None¶
Adds arguments to the subcmd parser
no-op if no special arguments is used for the subcmd
- Paramètres:
parser – the sub-command parser already added to main CMD subparsers
- name = 'get_urssaf3p_invoice_payload'¶
- class endi.plugins.sap_urssaf3p.endi_admin_commands.GetUrssafPaymentRequestById¶
Bases :
AbstractCommandGet specific payment request registred by Urssaf from its id
- classmethod add_arguments(parser) None¶
Adds arguments to the subcmd parser
no-op if no special arguments is used for the subcmd
- Paramètres:
parser – the sub-command parser already added to main CMD subparsers
- name = 'get_urssaf3p_payment_request'¶
- class endi.plugins.sap_urssaf3p.endi_admin_commands.GetUrssafPaymentRequestsByPeriod¶
Bases :
AbstractCommandGet all payment requests registred by Urssaf
- classmethod add_arguments(parser) None¶
Adds arguments to the subcmd parser
no-op if no special arguments is used for the subcmd
- Paramètres:
parser – the sub-command parser already added to main CMD subparsers
- name = 'get_urssaf3p_payment_requests_by_period'¶
- class endi.plugins.sap_urssaf3p.endi_admin_commands.ImportFromAis¶
Bases :
AbstractCommandImport Urssaf customer data from AIS export file.
File is supposed to be converted in CSV format first.
endi-admin /config/endi.ini urssaf3p_import_from_ais /config/client_sap.csv
- classmethod add_arguments(parser: ArgumentParser) None¶
Adds arguments to the subcmd parser
no-op if no special arguments is used for the subcmd
- Paramètres:
parser – the sub-command parser already added to main CMD subparsers
- name = 'urssaf3p_import_from_ais'¶
- class endi.plugins.sap_urssaf3p.endi_admin_commands.InitializeURSSAFProducts¶
Bases :
AbstractCommandInitialize all products from the URSSAF SAP nomenclature
May be useful for newcommers to enDi.
- Sources:
Pour les natures, colone 1 : code nature, colone 2 : libellé court
- URSSAF_NOMENCLATURE = [{'tva': 550, 'natures': [('10', 'Garde d’enfant handicapé'), ('20', 'Accompagnement d’enfant handicapé'), ('30', 'Aide humaine'), ('40', 'Conduite du véhicule personnel'), ('50', 'Accompagnement pour les sorties'), ('220', 'Interprétariat et codage')]}, {'tva': 1000, 'natures': [('60', 'Ménage- repassage'), ('80', 'Petit bricolage'), ('90', 'Garde d’enfant + 6 ans'), ('100', 'Soutien scolaire'), ('110', 'Coiffure – esthétique'), ('120', 'Préparation de repas'), ('130', 'Livraison de repas'), ('140', 'Collecte et livraison de linge'), ('170', 'Soins et promenades d’animaux'), ('150', 'Livraison de course'), ('190', 'Assistance administrative'), ('200', 'Accompagnement d’enfant + 6 ans'), ('230', 'Conduite du véhicule personnel – temporaire'), ('240', 'Accompagnement pour les sorties – temporaire'), ('250', 'Aide humaine – temporaire')]}, {'tva': 2000, 'natures': [('70', 'Jardinage'), ('160', 'Assistance informatique'), ('180', 'Gardiennage'), ('210', 'Téléassistance'), ('260', 'Plateforme de coordination'), ('270', 'Divers – Non eligible')]}]¶
- name = 'initialize_urssaf_products'¶
- endi.plugins.sap_urssaf3p.endi_admin_commands.includeme(config)¶
endi.plugins.sap_urssaf3p.populate module¶
- endi.plugins.sap_urssaf3p.populate.includeme(config)¶
- endi.plugins.sap_urssaf3p.populate.populate_sap_urssaf3p_config(session)¶
Payment creation is enabled by default
- endi.plugins.sap_urssaf3p.populate.populate_sap_urssaf3p_payment_mode(session)¶
endi.plugins.sap_urssaf3p.serializers module¶
Serializers pour se mapper sur les modèles de données de l’URSSAF API Tiers de Paiement
On utilise les schémas colander pour faire la sérialization. Cela présente des limites, par exemple dans le sens « sérialisation », les validateurs ne sont pas appliqués.
- class endi.plugins.sap_urssaf3p.serializers.ActualFloat¶
Bases :
Floatcolander serialize the number back to str. Lets revert to number.
- serialize(node, appstruct)¶
- class endi.plugins.sap_urssaf3p.serializers.EndiDecimalRepresentation(*args, **kwargs)¶
Bases :
SchemaTypeSerialize an enDi decimal-as-integer to JS Number with two decimals
- class endi.plugins.sap_urssaf3p.serializers.InputAdresseDTOSchema(*args, **kw)¶
Bases :
Schema- {
« type » : « object », « required » : [ « codeCommune », « codePays », « codePostal », « libelleCommune » ], « properties » : {
- « numeroVoie »{
« type » : « string », « example » : « 8 », « description » : « Numéro de la voie. Facultatif », « maxLength » : 20, « pattern » : « ^(?!^0$)([0-9]){0,20}$ »
}, « lettreVoie » : {
« type » : « string », « example » : « B », « description » : « Lettre associée au numéro de voie (B pour Bis, T pour Ter, Q pour Quater, C pour Quinquiès). Facultatif », « maxLength » : 1
}, « codeTypeVoie » : {
« type » : « string », « example » : « R », « description » : « Code type de voie. Facultatif. 4 caratères alphanumeriques maximum. », « maxLength » : 4, « pattern » : « ^([0-9A-Za-z]){0,4}$ »
}, « libelleVoie » : {
« type » : « string », « example » : « du Soleil », « description » : « Nom de la voie. Facultatif », « maxLength » : 28
}, « complement » : {
« type » : « string », « example » : « Batiment A », « description » : « Complément d’adresse. Facultatif », « maxLength » : 38
}, « lieuDit » : {
« type » : « string », « example » : « Le Beyssat », « description » : « Lieu-dit. Facultatif », « maxLength » : 38
}, « libelleCommune » : {
« type » : « string », « example » : « LYON 01 », « description » : « Libelle de la commune. Obligatoire. Précision : les libellés attendus sont ceux du code officiel géographique INSEE. Aucun contrôle n’est effectué sur le libellé. La validité de l’information est de la responsabilité du tiers de prestation. », « minLength » : 1, « maxLength » : 50
}, « codeCommune » : {
« type » : « string », « example » : « 69101 », « description » : « Code INSEE de la commune (cf nomenclature INSEE). Obligatoire. Aucun contrôle n’est effectué sur l’existence du code. La validité de l’information est de la responsabilité du tiers de prestation. », « minLength » : 5, « maxLength » : 5, « pattern » : « ^[0-9][0-9a-bA-B][0-9]{3}$ »
}, « codePostal » : {
« type » : « string », « example » : « 69001 », « description » : « Code postal de la commune (exemple : 75001 pour Paris 1er arrondissement). Obligatoire », « minLength » : 5, « maxLength » : 5, « pattern » : « ^[0-9]{5}$ »
}, « codePays » : {
« type » : « string », « example » : « 99100 », « description » : « Code INSEE du pays sur 5 caractères numériques (cf nomenclature INSEE). Obligatoire. Aucun contrôle n’est effectué sur l’existence du code. La validité de l’information est de la responsabilité du partenaire. », « minLength » : 5, « maxLength » : 5, « pattern » : « ^[0-9]{5}$ »
}
}
- class endi.plugins.sap_urssaf3p.serializers.InputCommuneDTO(*args, **kw)¶
Bases :
Schema- {
« type » : « object », « required » : [ « codeCommune » ], « properties » : {
- « codeCommune »{
« type » : « string », « example » : « 001 », « description » : « Code INSEE de la commune de naissance, 3 caractères numériques (DOM), 2 caractères numériques (TOM) (cf nomenclature INSEE). Obligatoire. Aucun contrôle n’est effectué sur l’existence du code. La validité de l’information est de la responsabilité du tiers de prestation. », « minLength » : 3, « maxLength » : 3, « pattern » : « ^[0-9]{3}$ »
}, « libelleCommune » : {
« type » : « string », « example » : « Lyon », « description » : « Libellé de la commune de naissance. Facultatif. Aucun contrôle n’est effectué sur l’existence du libellé. La validité de l’information est de la responsabilité du tiers de prestation. », « minLength » : 1, « maxLength » : 50
}
}
}
- serialize_sap_customer_data(urssaf_data: UrssafCustomerData)¶
- class endi.plugins.sap_urssaf3p.serializers.InputCoordonneeBancaireDTOSchema(*args, **kw)¶
Bases :
Schema- {
« type » : « object », « required » : [ « bic », « iban », « titulaire » ], « properties » : {
- « bic »{
« type » : « string », « example » : « BNAPFRPPXXX », « description » : « Identifiant BIC. Obligatoire. Le BIC est constitué : d’un code banque sur 4 caractères, d’un code pays (ISO 3166) sur 2 caractères, d’un code emplacement sur 2 caractères, d’un code branche, optionnel, sur 3 caractères. Celui-ci peut être facultativement complété avec trois X pour que le BIC soit sur 11 caractères », « minLength » : 8, « maxLength » : 11, « pattern » : « ^[a-zA-Z]{6}[0-9a-zA-Z]{2}([0-9a-zA-Z]{3})?$ »
}, « iban » : {
« type » : « string », « example » : « FR7630006000011234567890189 », « description » : « identifiant IBAN. Obligatoire. L’IBAN est constitué : d’un code pays (ISO 3166) sur 2 caractères,d’une clé de contrôle sur 2 caractères, permettant de s’assurer de l’intégrité du compte, d’un BBAN sur 14 à 34 caractères (23 caractères pour les comptes français (ancien format du RIB)) », « minLength » : 18, « maxLength » : 38, « pattern » : « ^[a-zA-Z]{2}[0-9]{2}[a-zA-Z0-9]{4}[0-9]{7}([a-zA-Z0-9]?){0,16}$ »
}, « titulaire » : {
« type » : « string », « example » : « Mme Jeanne Martin », « description » : « titulaire du compte, civilité, nom et prénom. Obligatoire », « minLength » : 1, « maxLength » : 100
}
}
}
- serialize_sap_customer_data(urssaf_data: UrssafCustomerData)¶
- class endi.plugins.sap_urssaf3p.serializers.InputDemandePaiementSchema(*args, **kw)¶
Bases :
SchemaSerializer for URSSAF InputDemandePaiementSerializer
InputDemandePaiementSerializer as described from v1.30.3 is bellow {
« type »: « object », « required »: [
« dateDebutEmploi », « dateFacture », « dateFinEmploi », « dateNaissanceClient », « idClient », « idTiersFacturation », « inputPrestations », « mntFactureHT », « mntFactureTTC », « numFactureTiers »
], « properties »: {
- « idTiersFacturation »: {
« type »: « string », « example »: « 1081230 », « title »: « Identifiant du tiers de prestation qui recevra le paiement, identifiant SI . »
}, « idClient »: {
« type »: « string », « example »: « 11000000000104 », « title »: « Identifiant du client du tiers de prestation, identifiant SI . »
}, « dateNaissanceClient »: {
« type »: « string », « format »: « date », « example »: « 1986-11-30T00:00:00Z », « title »: « Date de naissance du client du tiers de prestation. Utilisé pour vérifier la cohérence des informations. »
}, « numFactureTiers »: {
« type »: « string », « example »: « 11000000000104 », « title »: « Numéro de la facture, identifiant SI Tiers de prestation. . »
}, « dateFacture »: {
« type »: « string », « format »: « date », « example »: « 2019-12-01T00:00:00Z », « title »: « Date à laquelle la facture a été émise par le partenaire. »
}, « dateDebutEmploi »: {
« type »: « string », « format »: « date », « example »: « 2019-11-01T00:00:00Z », « title »: « Date de début de la première prestation de la demande de paiement. »
}, « dateFinEmploi »: {
« type »: « string », « format »: « date », « example »: « 2019-11-30T00:00:00Z », « title »: « Date de fin de la dernière prestation de la demande de paiement. »
}, « mntAcompte »: {
« type »: « number », « example »: 100, « title »: « Montant de l’acompte que le client aurait pu verser au tiers de prestation »
}, « dateVersementAcompte »: {
« type »: « string », « format »: « date », « example »: « 2019-11-25T00:00:00Z », « title »: « Date à laquelle le client aurait pu verser un acompte au tiers de prestation. »
}, « mntFactureTTC »: {
« type »: « number », « example »: 2000, « title »: « Montant total de la facture Toutes Taxes Comprises. »
}, « mntFactureHT »: {
« type »: « number », « example »: 1800, « title »: « Montant total de la facture Hors Taxes. »
}, « inputPrestations »: {
« type »: « array », « description »: « Listes des prestations effectuées pour cette demande de paiement pour ce client. », « items »: {
« $ref »: « #/definitions/InputPrestation »
}
}
}
}
- class endi.plugins.sap_urssaf3p.serializers.InputLieuNaissancoDTOSchema(*args, **kw)¶
Bases :
Schema- {
« type »: « object », « required »: [
« codePaysNaissance »
], « properties »: {
- « codePaysNaissance »: {
« type »: « string », « example »: « 99100 », « description »: « Code INSEE du pays sur 5 caractères numériques (cf nomenclature INSEE). Obligatoire », « minLength »: 5, « maxLength »: 5, « pattern »: « ^[0-9]{5}$ »
}, « departementNaissance »: {
« type »: « string », « example »: « 069 », « description »: « Code INSEE du département à la date de naissance ou TOM (si pays = France) Format : 3 caractères alphanumériques : 001, 040, 976. 02B pour le département de Haute-Corse. Précision : cette donnée est obligatoire si et seulement si le code Pays de naissance correspond à celui de la France. Facultatif », « minLength »: 3, « maxLength »: 3, « pattern »: « ^[09][0-9][0-9abAB]$ »
}, « communeNaissance »: {
« description »: « Commune de naissance. Précision : cette donnée est obligatoire si et seulement si le code Pays de naissance correspond à celui de la France. Facultatif », « $ref »: « #/definitions/InputCommuneDTO »
}
}
}
- serialize_sap_customer_data(urssaf_data: UrssafCustomerData)¶
- class endi.plugins.sap_urssaf3p.serializers.InputParticulierDTOSchema(*args, **kw)¶
Bases :
Schema- {
« type »: « object », « required »: [
« adresseMail », « adressePostale », « civilite », « coordonneeBancaire », « dateNaissance », « lieuNaissance », « nomNaissance », « numeroTelephonePortable », « prenoms »
], « properties »: {
- « civilite »: {
« type »: « string », « example »: « « 1 » », « description »: « Civilite du client, valeurs possibles : 1 = masculin (Monsieur) ou 2 = féminin (Madame). Obligatoire », « enum »: [
« 1 », « 2 »
]
}, « nomNaissance »: {
« type »: « string », « example »: « Durand », « description »: « Nom de naissance du client. 100 caractères maximum. Obligatoire. Le nom ne doit pas comporter de chiffres, ni de caractères spéciaux à l’exception de l’apostrophe (‘), du tiret (-) et de l’espace ( ). Il ne doit ni commencer ni finir par un caractère spécial. », « minLength »: 1, « maxLength »: 80, « pattern »: « ^[pL]+(([pL”- ])*)+([pL])|(^[pL])$ »
}, « nomUsage »: {
« type »: « string », « example »: « Martin », « description »: « Nom d’usage du client. Facultatif si n’est pas différent du nom de naissance, attendu si différent. Le nom ne doit pas comporter de chiffres, ni de caractères spéciaux à l’exception de l’apostrophe (‘), du tiret (-) et de l’espace ( ). Il ne doit ni commencer ni finir par un caractère spécial. », « maxLength »: 80, « pattern »: « ^[pL]+(([pL”- ])*)+([pL])|(^[pL])$ »
}, « prenoms »: {
« type »: « string », « example »: « Eric-Antoine Derc’hen Jean alain », « description »: « Les prenoms du client séparés par un espace. Il est attendu les prénoms d’usage du particulier s’il s’agit de prénom composé, le premier prénom sinon. Obligatoire. Le prénom ne doit pas comporter de chiffres, ni de caractères spéciaux à l’exception de l’apostrophe (‘), du tiret (-) et de l’espace ( ). Il ne doit ni commencer ni finir par un caractère spécial. », « minLength »: 1, « maxLength »: 80, « pattern »: « ^[pL]+([”-]*[pL]+)*((){1}[pL]+([”-]*[pL]+)*)*$ »
}, « dateNaissance »: {
« type »: « string », « format »: « date », « example »: « 1980-03-29T00:00:00.000Z », « description »: « Date de naissance du client. Obligatoire »
}, « lieuNaissance »: {
« description »: « Lieu de naissance du client. Obligatoire », « $ref »: « #/definitions/InputLieuNaissanceDTO »
}, « numeroTelephonePortable »: {
« type »: « string », « example »: « 0605040302 », « description »: « Numéro de téléphone portable du client. Obligatoire. 10 chiffres (ou jusqu’à 12 caractères si le premier caractère est un +), sans espaces. Commence par 06 ou 07 ou +33 », « pattern »: « ^(0|+33)[6-7]([0-9]{2}){4}$ »
}, « adresseMail »: {
« type »: « string », « example »: « jeanne.durand@contact.fr », « description »: « Adresse mail du client. Obligatoire. Structure de l’adresse mail respectée (avec un @ et un nom de domaine) », « pattern »: « ^[-A-Za-z0-9_]+(.[-A-Za-z0-9_]+)*@[A-Za-z0-9]+((-|.)[A-Za-z0-9]+)*.[A-Za-z]+$ »
}, « adressePostale »: {
« description »: « Adresse postale du client. Obligatoire », « $ref »: « #/definitions/InputAdresseDTO »
}, « coordonneeBancaire »: {
« description »: « Coordonnées bancaires du client. Obligatoire », « $ref »: « #/definitions/InputCoordonneeBancaireDTO »
}
}
}
- class endi.plugins.sap_urssaf3p.serializers.InputPrestationSchema(*args, **kw)¶
Bases :
SchemaSerializer for URSSAF InputPrestationSerializer
InputPrestationSerializer as described from v1.30.3 is bellow {
« type » : « object », « required » : [
« codeNature », « mntPrestationHT », « mntPrestationTTC », « mntPrestationTVA », « mntUnitaireTTC », « quantite », « unite »
], « properties » : {
- « codeActivite »{
« type » : « string », « example » : « 01 », « description » : « Code d’activité lié à la nature de l’emploi »
}, « codeNature » : {
« type » : « string », « example » : « ENF », « description » : « Code nature qui correspond aux natures d’emploi définit pas le code du travail (article D7231-1) »
}, « quantite » : {
« type » : « number », « example » : 1.75, « description » : « Nombre d’unitée pour cette prestation. »
}, « unite » : {
« type » : « string », « example » : « HEURE », « description » : « Correspond à l’unité de la prestation effectuée. Peut avoir deux valeurs : “HEURE” si la prestation correspond à un nombre d’heures effectuées ou “FORFAIT” s’il s’agit d’un forfait. »
}, « mntUnitaireTTC » : {
« type » : « number », « example » : 20.0, « title » : « Montant du prix unitaire de la prestation. »
}, « mntPrestationTTC » : {
« type » : « number », « example » : 120.0, « title » : « Montant TTC de cette prestation = mntUnitaireTTC x quantite »
}, « mntPrestationHT » : {
« type » : « number », « example » : 100.0, « title » : « Montant Hors Taxes de cette prestation »
}, « mntPrestationTVA » : {
« type » : « number », « example » : 20.0, « title » : « Montant des Taxes pour cette prestation »
}, « dateDebutEmploi » : {
« type » : « string », « format » : « date », « example » : « 2019-11-01T00:00:00Z », « title » : « Date de début de cette prestation. »
}, « dateFinEmploi » : {
« type » : « string », « format » : « date », « example » : « 2019-11-30T00:00:00Z », « title » : « Date de fin de cette prestation de la demande de paiement. »
}, « complement1 » : {
« type » : « string », « example » : « Complément 1 « , « title » : « Contenu informatif concernant cette prestation. »
}, « complement2 » : {
« type » : « string », « example » : « Complément 2 « , « title » : « Contenu informatif concernant cette prestation. »
}
}
},
- class endi.plugins.sap_urssaf3p.serializers.InputPrestationSequenceSchema(*args, **kw)¶
Bases :
SequenceSchema
- class endi.plugins.sap_urssaf3p.serializers.URSSAFASCIIString(encoding=None, allow_empty=False)¶
Bases :
StringURSSAF string with very limited charset
Described by URSSAF as: - ne doit pas comporter de chiffres, ni de caractères spéciaux à l’exception de l’apostrophe (‘), du tiret (-) et de l’espace ( ). - ne doit ni commencer ni finir par un caractère spécial. »,
Serialization will take care of removing/replacing everything not matching that.
- INVALID_BODY_CHAR = re.compile("[^A-z'\\- ]")¶
- INVALID_END_CHARS = re.compile('[^A-z]+$')¶
- INVALID_START_CHARS = re.compile('^[^A-z]+')¶
- class endi.plugins.sap_urssaf3p.serializers.URSSAFCivilite(encoding=None, allow_empty=False)¶
Bases :
String- map = {'Madame': '2', 'Monsieur': '1'}¶
- class endi.plugins.sap_urssaf3p.serializers.URSSAFDateTime(default_tzinfo=datetime.timezone.utc, format=None)¶
Bases :
DateTimeURSSAF only supports a subset of ISO8601 syntax
Eg. for Timezone, the presence of the UTC zulu marker (final Z) seems mandatory.
- RE_NUMERIC_UTC_SHIFT = re.compile('\\+\\d\\d:\\d\\d$')¶
- serialize(node, appstruct)¶
- class endi.plugins.sap_urssaf3p.serializers.URSSAFWorkUnit(encoding=None, allow_empty=False)¶
Bases :
StringSérialize une unité au sens endi vers l’unité au sens URSSAF
- endi.plugins.sap_urssaf3p.serializers.fix_tva_rounding(cstruct: dict) dict¶
Fix TVA/TTC amounts to pass URSSAF checks
URSSAF enforces two consistency checks:
invoice-level: sum(product.mntPrestationTTC for product in inputPresations) == mntFactureTTC
line-level : mntUnitaireTTC * quantite == mntPrestationTTC
The way we compute TVA (on the sum, groupped by TVA rate, and not per-line) will in certain cases fail to match check #1 : can lead to extra-cent in total.
There is no perfect option. Workaround here is to tweak the first line of the invoice to add/remove the extra-cent in it. Thus modifying for first line:
mntPrestationTTC
mntUnitaireTTC
mntPrestationTVA.
- Paramètres:
cstruct – cstruct of the demande
- Renvoie:
cstruct with rounded parameters.
Module contents¶
- endi.plugins.sap_urssaf3p.includeme(config)¶