diff --git a/bt5/erp5_payroll_l10n_fr/SkinTemplateItem/portal_skins/erp5_payroll_l10n_fr/DSNEarlyRecoveryReport_getDataDict.py b/bt5/erp5_payroll_l10n_fr/SkinTemplateItem/portal_skins/erp5_payroll_l10n_fr/DSNEarlyRecoveryReport_getDataDict.py
index 05d98536a02691e99401008ca6846a591a25e124..293edff8a7512cb50c8c2d604852cddc8d0ef80a 100644
--- a/bt5/erp5_payroll_l10n_fr/SkinTemplateItem/portal_skins/erp5_payroll_l10n_fr/DSNEarlyRecoveryReport_getDataDict.py
+++ b/bt5/erp5_payroll_l10n_fr/SkinTemplateItem/portal_skins/erp5_payroll_l10n_fr/DSNEarlyRecoveryReport_getDataDict.py
@@ -26,7 +26,7 @@ if block_id == 'S20.G00.05':
   rubric_value_dict['S20.G00.05.001'] = kw['dsn_type']
   rubric_value_dict['S20.G00.05.002'] = '01'
   rubric_value_dict['S20.G00.05.003'] = '11'
-  rubric_value_dict['S20.G00.05.004'] = '1' # TODO : to increment for each new event DSN
+  rubric_value_dict['S20.G00.05.004'] = kw['order']
   rubric_value_dict['S20.G00.05.006'] = ''
   rubric_value_dict['S20.G00.05.007'] = formatDate(DateTime(now.year(), now.month(), now.day()))
   rubric_value_dict['S20.G00.05.009'] = ''
@@ -54,11 +54,14 @@ elif block_id == 'S21.G00.11':
 
 # Individu
 if block_id == 'S21.G00.30':
-  rubric_value_dict["S21.G00.30.001"] = ''.join(target.getSocialCode().split(' '))[:13] # sometimes there are spaces in textfield
+  social_code = target.getSocialCode('')
+  rubric_value_dict["S21.G00.30.001"] = ("" if not social_code else "".join(social_code.split(' '))[:13])
+  rubric_value_dict["S21.G00.30.001"] = ''.join(target.getSocialCode('').split(' '))[:13] # sometimes there are spaces in textfield
   rubric_value_dict["S21.G00.30.002"] = target.getLastName()
   rubric_value_dict["S21.G00.30.003"] = '' # Nom d'usage
   rubric_value_dict["S21.G00.30.004"] = ' '.join([target.getFirstName(), target.getMiddleName() or '']).strip()
   rubric_value_dict["S21.G00.30.006"] = formatDate(target.getStartDate())
+  rubric_value_dict["S21.G00.30.020"] = target.getCareerReference('')
 
 # Contrat
 if block_id == 'S21.G00.40':
diff --git a/bt5/erp5_payroll_l10n_fr/SkinTemplateItem/portal_skins/erp5_payroll_l10n_fr/DSNMonthlyReport_getDataDict.py b/bt5/erp5_payroll_l10n_fr/SkinTemplateItem/portal_skins/erp5_payroll_l10n_fr/DSNMonthlyReport_getDataDict.py
index 781381121910b6c0cfad819f65472cf312d2cb5c..b4e19cf093b13cf350898d2ed924437634da90cb 100644
--- a/bt5/erp5_payroll_l10n_fr/SkinTemplateItem/portal_skins/erp5_payroll_l10n_fr/DSNMonthlyReport_getDataDict.py
+++ b/bt5/erp5_payroll_l10n_fr/SkinTemplateItem/portal_skins/erp5_payroll_l10n_fr/DSNMonthlyReport_getDataDict.py
@@ -212,6 +212,11 @@ if block_id == 'S21.G00.23':
 if block_id == 'S21.G00.30':
   birth_country_code = getCountryCode(target)
   address = target.getDefaultAddressStreetAddress().strip().split('\n')
+  if ',' in address[0]:
+    address_complement = address[0].split(',', 1)[1].strip()
+    address[0] = address[0].split(',', 1)[0]
+  else:
+    address_complement = ''
   social_code = target.getSocialCode('')
   rubric_value_dict["S21.G00.30.001"] = ("" if not social_code else "".join(social_code.split(' '))[:13])
   rubric_value_dict["S21.G00.30.002"] = target.getLastName()
@@ -229,7 +234,7 @@ if block_id == 'S21.G00.30':
   rubric_value_dict["S21.G00.30.013"] = enrollment_record.getUeCode()
   rubric_value_dict["S21.G00.30.014"] = enrollment_record.getBirthDepartment()
   rubric_value_dict["S21.G00.30.015"] = enrollment_record.getBirthCountryCode()
-  rubric_value_dict["S21.G00.30.016"] = ''
+  rubric_value_dict["S21.G00.30.016"] = address_complement
   rubric_value_dict["S21.G00.30.017"] = (' '.join(address[1:]).strip() if len(address) > 1 else '')
   rubric_value_dict["S21.G00.30.018"] = target.getDefaultEmailCoordinateText() or ''
   rubric_value_dict["S21.G00.30.019"] = ''
@@ -248,6 +253,8 @@ if block_id == 'S21.G00.40':
   rubric_value_dict["S21.G00.40.008"] = enrollment_record.getSpecialContractType()
   rubric_value_dict["S21.G00.40.009"] = '00000'
   rubric_value_dict["S21.G00.40.010"] = ('' if enrollment_record.getContractType() not in ('02', '29') else formatDate(enrollment_record.getCareerStopDate()))
+  if enrollment_record.getCareerStopDate() and enrollment_record.getCareerStopDate() <= context.getEffectiveDate():
+    rubric_value_dict["S21.G00.40.010"] = formatDate(enrollment_record.getCareerStopDate())
   rubric_value_dict["S21.G00.40.011"] = enrollment_record.getWorkingUnitType()
   rubric_value_dict["S21.G00.40.012"] = formatFloat(enrollment_record.getStandardWorkingUnit())
   rubric_value_dict["S21.G00.40.013"] = formatFloat(enrollment_record.getWorkingUnitQuantity())
@@ -379,6 +386,10 @@ if block_id == 'S21.G00.71':
     code = 'RETA'
   elif enrollment_record.getComplementaryRetirementStatus() == '01':
     code = 'RETC'
+  elif enrollment_record.getComplementaryRetirementStatus() == '99':
+    code = '90000'
+  else:
+    raise ValueError('Unsupported Code for Complementary Retirement Status in Enrollement Record %s' % enrollment_record.absolute_url())
   rubric_value_dict['S21.G00.71.002'] = code
 
 if block_id == 'S21.G00.78':
diff --git a/bt5/erp5_payroll_l10n_fr/SkinTemplateItem/portal_skins/erp5_payroll_l10n_fr/DSNMonthlyReport_makeReport.py b/bt5/erp5_payroll_l10n_fr/SkinTemplateItem/portal_skins/erp5_payroll_l10n_fr/DSNMonthlyReport_makeReport.py
index 54b7d8311f191a6a9a1474e40bc3f57043aef717..d315c6565a5b8cd1e82525ff8f6cab0f79b64640 100644
--- a/bt5/erp5_payroll_l10n_fr/SkinTemplateItem/portal_skins/erp5_payroll_l10n_fr/DSNMonthlyReport_makeReport.py
+++ b/bt5/erp5_payroll_l10n_fr/SkinTemplateItem/portal_skins/erp5_payroll_l10n_fr/DSNMonthlyReport_makeReport.py
@@ -191,6 +191,9 @@ else:
     dsn_file.append(getDSNBlockDict(block_id='S21.G00.23',
                                     target=aggregated_social_contribution_dict[ctp_code]))
 
+dsn_file.append(getDSNBlockDict(block_id='S21.G00.42', target=establishment))
+dsn_file.append(getDSNBlockDict(block_id='S21.G00.44', target=establishment))
+
 for employee_data_dict, paysheet_data_dict in employee_result_list:
   enrollment_record = employee_data_dict['enrollment_record']
   employee = employee_data_dict['person_relative_url']
diff --git a/bt5/erp5_payroll_l10n_fr/SkinTemplateItem/portal_skins/erp5_payroll_l10n_fr/PaySheetTransaction_getSocialContributionDict.py b/bt5/erp5_payroll_l10n_fr/SkinTemplateItem/portal_skins/erp5_payroll_l10n_fr/PaySheetTransaction_getSocialContributionDict.py
index c9e8af183e3b8d5f24b0b076398d5e6799ac7d95..b832c974b6638469b483df3e8cee289661222b5f 100644
--- a/bt5/erp5_payroll_l10n_fr/SkinTemplateItem/portal_skins/erp5_payroll_l10n_fr/PaySheetTransaction_getSocialContributionDict.py
+++ b/bt5/erp5_payroll_l10n_fr/SkinTemplateItem/portal_skins/erp5_payroll_l10n_fr/PaySheetTransaction_getSocialContributionDict.py
@@ -109,7 +109,7 @@ def makeIndividualContributionBlock(movement, category):
   if category in ('018', '063', '064', '059'):
     quantity = (getattr(movement, 'employer_total_price', 0) + getattr(movement, 'employee_total_price', 0)) * -1
     if category == '018':
-      assert quantity < 0.
+      assert quantity <= 0., "Quantity in %s should be negative" % movement.absolute_url()
       base = movement.base
   else:
     base = movement.base
@@ -139,6 +139,9 @@ def makeOtherBonusBlock(movement, category):
   }
 
 for movement in context.PaySheetTransaction_getMovementList():
+  if not movement.base:
+    continue
+
   contribution_set = set(movement.getBaseContributionValueList())
 
   ctp_set = all_ctp_set.intersection(contribution_set)