<%@ language = "JavaScript" %>
<%  Server.ScriptTimeout=6000; %>
<% /*
     $Revision$
     $Id$

     File:          api_bct_factuur_import.asp
     Description:   API voor het importeren van data uit xmlbestanden.
                    Werking werkt naar analogie van gen_import.
     Parameters:    Upload van een xml
     Status:
     Context:       Callback functie vanuit BCT vanuit export/BCTAdapter.asp
     Notes:         Kopie van API/api_gen_import.asp met MARX/BCT specifieke aanvullingen
*/
    DOCTYPE_Disable = 1;
%>
<!-- #include file="../../appl/Shared/common.inc" -->
<!-- #include file="../../appl/api/api.inc" -->
<!-- #include file="../../appl/shared/FlexFiles.inc" -->
<!-- #include file="../Shared/xml_converter.inc" -->
<script language="javascript" src="../imp/imp_shared.js" runat="server"></script>
<%
    // We sturen het antwoord in UTF-8.
    Session.Codepage = 65001;
    Response.Charset = 'utf-8';

    var API = new API_func();

    // In APPL\MARX\export\BCTAdapter.asp zijn mar_queue_key en mar_queue_requestid
    // aan de callbackurl voor API=FIN_FACTUUR_PDF toegevoegd.
    // Die gebruiken we hier om te registreren dat de factuur blijkbaar goed ingescand is
    var mar_queue_requestid = getQParam("mar_queue_requestid");
    var mar_queue_key = getQParamInt("mar_queue_key");
    var sql = "SELECT mar_factuur_queue_aanmaak"
            + "     , prs_perslid_key"
            + "     , mar_factuur_queue_replied"
            + "     , mar_factuur_queue_filename"
            + "     , mar_factuur_queue_filesize"
            + "  FROM mar_factuur_queue"
            + " WHERE mar_factuur_queue_key = " + mar_queue_key // performance
            + "   AND mar_factuur_queue_requestid = " + safe.quoted_sql(mar_queue_requestid); // authenticatie
    oRs = Oracle.Execute(sql);
    if (oRs.EOF)
    {
        oRs.Close();
        _AiAi("mar_factuur_queue record not found for key {0}".format(mar_queue_key));
    }
    if (oRs("mar_factuur_queue_replied").Value != null)
    {
        var dtaanmaak = new Date(oRs("mar_factuur_queue_aanmaak").Value);
        var dtreply = new Date(oRs("mar_factuur_queue_replied").Value);
        var filename = oRs("mar_factuur_queue_filename").Value;
        var filesize = oRs("mar_factuur_queue_filesize").Value;
        oRs.Close();
        _AiAi("Duplicate reply to mar_factuur_queue record key {0} (created {1}).\nFirst reply was {2}. Ignoring newer BCT reply.\nPDF file was {3} ({4} bytes or {5} as base64)"
                                .format(mar_queue_key, toDateTimeString(dtaanmaak, true), toDateTimeString(dtreply, true), filename, filesize, Math.round(filesize * 4 /3)));
    }
    var prs_perslid_contractant_key = oRs("prs_perslid_key").Value;
    oRs.Close();

    var sql = "UPDATE mar_factuur_queue"
            + "   SET mar_factuur_queue_replied = SYSDATE"
            + " WHERE mar_factuur_queue_key = " + mar_queue_key;
    Oracle.Execute(sql);

    var import_app_key = API.apidata.options['import_app_key'];
    var bytes = Request.TotalBytes;
    if (bytes == 0)
    {
        __DoLog("api_bct_factuur_import empty body posted", "#ffff00");
        Response.Write("Error: no data posted for API import");
        Response.End; // Grof maar anders AiAi, dat is nog erger
    }

    fileStream = Server.CreateObject("ADODB.Stream");
    fileStream.Type = 1; // adTypeBinary eerst nog
    fileStream.Open();
    "Error 'Operation not Allowed' op de volgende regel betekent meestal dat de upload te groot is";
    fileStream.Write(Request.BinaryRead(bytes));

    if (API.apidata.loglevel & 1 || __Logging > 0)
    {
        var savename = __Log2FileName("{0}_{1}".format(API.APIname, user_key));
        fileStream.SaveToFile(safe.UNC(savename), 2); //  2=adSaveCreateOverWrite
        __DoLog("Import file was saved in {0}".format(savename), "#ff4");
    }

    var res = impReadStream(fileStream, import_app_key,
                                            { fac_home: Server.MapPath(rooturl + "/") + "/",
                                              filepathname: "API " + API.APIname,
                                              customerId: customerId,
                                              keep_old: 300, // Parallelle import 300 seconden ondersteunen
                                              user_key: prs_perslid_contractant_key > 0?prs_perslid_contractant_key:user_key,
                                              stylesheet: API.apidata.stylesheet,
                                              keep_backup: true // mits fac_import_app_folder gezet
                                            });
    var import_key = res.import_key;

    if (res.success)
    {
        var warn = L("lcl_imp_read_lines") + res.read_lines;
        var res = impProcessStream(res.import_key, { customerId: customerId,
                                                     user_key: user_key });
    }
    else
    {
        var warn = res.warning;
        __DoLog("Import (app_key={0}) mislukt: {1}".format(import_app_key, warn), "#ffff00");
        API.error(warn); // Abort met 500-status
    }

    if (import_key > 0)
    {
        // Mareon specifieke code
        // Registreer de effectieve fin_factuur_key zoals aangemaakt
        if (mar_queue_requestid)
        {
            var sql = "UPDATE mar_factuur_queue"
                    + "   SET fin_factuur_key = (SELECT MAX(fin_factuur_key)"
                    + "                            FROM fac_imp_factuur"
                    + "                           WHERE fac_import_key = " + import_key + ")"
                    + " WHERE mar_factuur_queue_key = " + mar_queue_key;
            Oracle.Execute(sql);
        }
    }

    // BCT doet niets met de inhoud van onze response op hun request maar verwacht wel een XML formaat
    Response.ContentType = "text/xml";
    Response.Write("<?xml version=\"1.0\"?>"
                 + "<facilitor>"
                 + "    <result>OK</result>"
                 + "</facilitor>");

    ASPPAGE_END();
%>
