    /**
     * Renders a contact report as PDF and saves it to the archive.
     *
     * @eloas
     * @requires sol.common.Template
     * @requires sol.common.TranslateTerms
     * @requires sol.common.ObjectFormatter.TemplateSord
     * @requires sol.common.as.DocumentGenerator
     * @requires sol.common.as.ActionBase
     */
    sol.define("sol.contact.as.actions.CreateContactReport", {
      extend: "sol.common.as.ActionBase",

      requiredProperty: ["parentId", "targetId", "templateId"],

      initialize: function (config) {
        var me = this;
        me.$super("sol.common.as.ActionBase", "initialize", [config]);
        me.config = sol.create("sol.common.Config", { compose: "/contact/Configuration/contact.config" }).config;
        sol.common.TranslateTerms.require("sol.contact.as.actions.CreateContactReport");
      },

      getName: function () {
        return "CreateContactReport";
      },

      process: function () {
        var me = this,
            name = sol.create("sol.common.Template", { source: me.config.reporting.names.contact }).apply({ date: new Date() }),
            generator, result;

        generator = sol.create("sol.common.as.DocumentGenerator", {
          name: name,
          dataCollector: "RF_sol_common_services_ChildrenDataCollector",
          renderer: "sol.common.as.renderer.Fop",
          collectorConfig: {
            parentId: me.parentId,
            endLevel: -1,
            objKeys: [],
            totalCount: 50000,
            sordKeys: ["ownerName", "name", "maskName", "maskId", "id", "guid", "parentId", "XDateIso", "IDateIso"],
            maskName: me.config.contact.maskName,
            formatter: "sol.common.ObjectFormatter.TemplateSord"
          },
          rendererConfig: {
            targetId: me.targetId,
            templateId: me.templateId
          },
          compareFct: function (templateSord1, templateSord2) {
            if (!templateSord1.objKeys.CONTACT_REFERENCE && !templateSord2.objKeys.CONTACT_REFERENCE) {
              return 0;
            }
            if (!templateSord1.objKeys.CONTACT_REFERENCE) {
              return 1;
            }
            if (!templateSord2.objKeys.CONTACT_REFERENCE) {
              return -1;
            }
            return templateSord1.objKeys.CONTACT_REFERENCE.localeCompare(templateSord2.objKeys.CONTACT_REFERENCE);
          }
        });

        result = generator.process();

        if (result.objId) {
          me.addGotoIdEvent(result.objId);
        }
      }

    });