<%@ LANGUAGE = JavaScript %>
<% /*
     $Revision$
     $Id$

    File:               fin_edit_factuur_save.asp
    Description:        Sla de wijzigingen van het fin_edit_factuur formulier op.
                        Opslaan factuurgegevens en factuurregels.
    Parameters:
        fin_key
        fin_type
        referentienr ...and all other form u2 fields
    Context:            POST formulier vanuit fin_edit_factuur.asp
    Note:

*/ %>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/iface.inc" -->
<!-- #include file="../shared/save2db.inc" -->
<!-- #include file="../Shared/kenmerk_common.inc" -->
<!-- #include file="fin.inc" -->

<%
FCLTHeader.Requires({ js:[] })

var fin_key = getFParamInt("fin_key", -1);
var fin_type = getFParam("fin_type", -1);
var referentienr = getFParam("referentienr", "-1");
var fin_status_key = getFParamInt("fin_status_key", -1);
var copyfin_key = getFParamInt("copyfin_key", -1);
var totalEXC = getFParamFloat("totalEXC_txt", 0);
var totalBTW = getFParamFloat("totalBTW_txt", 0);
var rowIndex = getFParamInt("rowIndex", -1); // zoveel regels kan ik maximaal verwachten

var this_fin = fin.func_enabled_factuur(fin_key); // Wat heb ik zoal aan rechten

if (fin_key > 0)
  var fin_factuur_old = fin.factuur_info(fin_key);

user.auth_required_or_abort(this_fin.canChange); // TODO: testen AAIT#22473

var asContactpersoon = this_fin.canFEWrite && !this_fin.canFOWrite;
var referentiegegevens = fin.analysereferentie(referentienr, asContactpersoon);
// Het moet een geldige referentie zijn.
user.auth_required_or_abort(referentiegegevens.valid);

// Status van 3 (foute import) moet bij saven op 2 worden gezet.
if (fin_status_key == 3) fin_status_key = 2;

// Statis 6 (Akkoord) moet bij saven op 2 (Ingevoerd) worden gezet. Factuur dient indien nodig weer gefiatteerd te worden.
if (fin_status_key == 6) fin_status_key = 2;

// Deze velden altijd opslaan
// Merk op: fin_factuur_totaal en fin_factuur_totaal_btw krijgen later definitieve waarde
var fields = [ { dbs: "prs_perslid_key_user",        typ: "key",     val: user_key,         track: L("lcl_fin_name"),              foreign: "prs_perslid" },
               { dbs: "prs_perslid_key_goedkeur",    typ: "key",     frm: "goedkeurder",    track: L("lcl_fin_goedkeurder"),       foreign: "prs_perslid" },
               { dbs: "fin_factuur_datum",           typ: "date",    frm: "calendar",       track: L("lcl_fin_findate") },
               { dbs: "fin_factuur_opmerking",       typ: "varchar", frm: "remark",         track: L("lcl_fin_remark"),            len: 250 },
               { dbs: "fin_factuur_statuses_key",    typ: "key",     val: fin_status_key,   track: L("lcl_status"),                foreign: fin.getfinstatustext },
               { dbs: "fin_factuur_nr",              typ: "varchar", frm: "finnr",          track: L("lcl_fin_invoice_nr_extern"), len: 30 },
               { dbs: "fin_factuur_boekmaand",       typ: "varchar", frm: "finboekm",       track: L("lcl_fin_divide_period") },
               { dbs: "fin_factuur_debiteur_nr",     typ: "varchar", frm: "findebtor",      track: L("lcl_fin_debtor_nr"),         len: 30 },
               { dbs: "fin_factuur_totaal",          typ: "float",   frm: "totalEXC_txt",   track: L("lcl_fin_totaal_bedrag") },
               { dbs: "prs_kostensoort_key",         typ: "key",     frm: "fincostsrt",     track: L("lcl_shared_charge_type"),    foreign: "prs_kostensoort" },
               { dbs: "cnt_contract_plaats_key",     typ: "key",     frm: "cnt_plaats_key", track: L("lcl_cnt_location_scope"),    foreign: "cnt_contract_plaats" }
             ];

if (S("fin_factuur_verlegdmode") & 1 == 1)
    fields.push({ dbs: "fin_factuur_gbedrag", typ: "float", frm: "fingbedrag", track: L("lcl_fin_gbedrag") });

if (S("fin_factuur_flags") > 0)
    fields.push({ dbs: "fin_factuur_flag", typ: "key" /* geen echte key, wel key-gedrag */, frm: "finflag" /* notrack */ });

// Alle drie de waarden mldopdr_key, cnt_key en besopdr_key altijd op de juiste waarde zetten (waarde of NULL) bij update (en insert)
fields.push({ dbs: "mld_opdr_key",                typ: "key",     val: (referentiegegevens.mldopdr_key? referentiegegevens.mldopdr_key : ""), track: L("lcl_fin_mld_opdr"),     foreign: "mld_opdr"  });
fields.push({ dbs: "cnt_contract_key",            typ: "key",     val: (referentiegegevens.cnt_key? referentiegegevens.cnt_key : ""),         track: L("lcl_fin_cnt_contract"), foreign: "cnt_contract" });
fields.push({ dbs: "bes_bestelopdr_key",          typ: "key",     val: (referentiegegevens.besopdr_key? referentiegegevens.besopdr_key : ""), track: L("lcl_fin_bestelling"),   foreign: "bes_bestelopdr" });
fields.push({ dbs: "fin_factuur_totaal_btw",      typ: "float",   val: (totalBTW - totalEXC) });

var isNew = (fin_key == -1);
if (isNew)
{ // Insert factuur
  fields.push({ dbs: "fin_factuur_key",         typ: "key",   seq: "fin_s_fin_factuur_key" });

  var finIns = buildInsert("fin_factuur", fields);
  var fin_key = finIns.sequences["fin_factuur_key"];
  sql = finIns.sql;
  var err = Oracle.Execute(sql, true);
  if (err.friendlyMsg)
    abort_with_warning(err.friendlyMsg);

  shared.trackaction("FINNEW", fin_key);

  // Nu de diverse flexfiles van de bestaande naar de kopie opdracht kopieren
  if (copyfin_key > 0) // kopieren van de originele factuur
  {
    var flexsql = "SELECT k_old.fin_kenmerk_key k_old"
                + "     , k_old.fin_kenmerk_key k_new"
                + "  FROM fin_kenmerk k_old"
                + "     , fin_factuur f_old"
                + " WHERE f_old.fin_factuur_key = " + copyfin_key
                + "   AND k_old.fin_kenmerk_kenmerktype IN ('F', 'E', 'M')"
                + "   AND k_old.fin_kenmerk_verwijder IS NULL";

    CopyFlexFolders("FIN", "F", copyfin_key, "F", fin_key, flexsql);
  }
}
else
{ // Update factuur
  var finUpd = buildTrackingUpdate("fin_factuur", " fin_factuur_key = " + fin_key, fields);
  var err = Oracle.Execute(finUpd.sql, true);
  if (err.friendlyMsg)
    abort_with_warning(err.friendlyMsg);
}

var frnum = 0;
regelnr = 1;
var flextrackregels = [];
var finUpdTrackarray = []; // Alle tracking van elke afzondelijke regel verzamelen.
if (!isNew)
  finUpdTrackarray = finUpdTrackarray.concat(finUpd.trackarray);

// Nu de regels toevoegen/updaten.
if (fin_key < 0 || this_fin.canInvLinChange)
{
  while (frnum <= rowIndex)
  {
    var descrn = Request.Form("descript" + frnum).Count;
    var sumn = Request.Form("sum" + frnum).Count;
    var BTWn = Request.Form("BTW" + frnum).Count;

    if (descrn < 1 && sumn < 1 && BTWn < 1)
    {
      frnum++;
      continue;
    }

    var regel_key = getFParamInt("regel_key" + frnum, -1);
    var regel_id = getFParam("regel_id" + frnum, "");
    var descr = getFParam("descript" + frnum, "");
    var ref = getFParam("ref" + frnum, "");
    var sum = getFParamFloat("sum" + frnum, "");
    var BTWkey = getFParamInt("BTW" + frnum);
    var code = getFParam("artcode" + frnum, "");
    var aantal = getFParamFloat("amount" + frnum, "");
    var eenheid = getFParam("unit" + frnum, "");
    var opdrregelid = getFParamInt("opdrregelid" + frnum, "");

    if (regel_key < -1)
    {
      fin.deleteFactuurregel(-regel_key);
      fintrack = L("lcl_fin_regel_del") + ": " + descr + "/" + ref + "/" + sum;
    }
    else if ((sum === "") || regel_key == 0) // === zodat 0 niet gelijk is aan "".
    { // Geen waarden (omschrijving, excl. BTW) ingevuld of verwijderde nieuwe factuurregel
      if (regel_key > 0)
      {
        fin.deleteFactuurregel(regel_key);
        fintrack = L("lcl_fin_regel_del") + ": " + descr + "/" + ref + "/" + sum;
      }
    }
    else
    { // Nieuwe of bestaande factuurregels
      sql = "SELECT fin_btwtabelwaarde_perc"
          + "     , fin_btwtabelwaarde_verlegd"
          + " FROM fin_btwtabelwaarde"
          + " WHERE fin_btwtabelwaarde_key = " + BTWkey;
      oRs = Oracle.Execute(sql);
      // Er moet een waarde zijn.
      var BTW = oRs("fin_btwtabelwaarde_perc").value;
      var verlegd = oRs("fin_btwtabelwaarde_verlegd").value;
      oRs.Close();
      var fincostsrt = getFParamInt("fincostsrt" + frnum, -1);

      if (sum !== "") // !== zodat 0 niet gelijk is aan "".
      {
        var regelfields = [ { dbs: "fin_factuur_key",               typ: "key",     val: fin_key },
                            { dbs: "fin_factuurregel_nr",           typ: "number",  val: regelnr },
                            { dbs: "fin_factuurregel_totaal",       typ: "float",   val: sum,                                   track: L("lcl_fin_total_sum_exBTW") },
                            { dbs: "fin_factuurregel_btw",          typ: "float",   val: (verlegd ? 0 : (sum * BTW / 100)),     track: L("lcl_fin_btwsum"), len: 30 },
                            { dbs: "fin_factuurregel_omschrijving", typ: "varchar", val: descr,                                 track: L("lcl_descr"), len: 250 },
                            { dbs: "fin_factuurregel_referentie",   typ: "varchar", val: ref,                                   track: L("lcl_location"), len: 30 },
                            { dbs: "fin_btwtabelwaarde_key",        typ: "key",     val: BTWkey,                                track: L("lcl_fin_btwtarief"),      foreign: "fin_btwtabelwaarde" },
                            { dbs: "prs_kostensoort_key",           typ: "key",     val: (fincostsrt > 0? fincostsrt : "-1"),   track: L("lcl_shared_charge_type"), foreign: "prs_kostensoort" }
                          ];
        regelnr++;

        if (fin_splitsen_omschr)
        {
          regelfields.push({ dbs: "fin_factuurregel_code",         typ: "varchar", val: code,                                  track: L("lcl_fin_article_code"), len: 30 });
          regelfields.push({ dbs: "fin_factuurregel_aantal",       typ: "float",   val: aantal,                                track: L("lcl_fin_amount"), len: 11 });
          regelfields.push({ dbs: "fin_factuurregel_eenheid",      typ: "varchar", val: eenheid,                               track: L("lcl_fin_unit"), len: 30 });
          regelfields.push({ dbs: "fin_factuurregel_id",           typ: "number",  val: opdrregelid,                           track: L("lcl_fin_orderline_id"), len: 10 });
        }

        if (regel_key == -1)
        { // Nieuwe factuurregel
          regelfields.push({ dbs: "fin_factuurregel_key",      typ: "key",     seq: "fin_s_fin_factuurregel_key" });

          var finIns = buildInsert("fin_factuurregel", regelfields);
          var new_regel_key = finIns.sequences["fin_factuurregel_key"];
          Oracle.Execute(finIns.sql);
          var finUpd = {trackarray: [L("lcl_fin_invoicerow_add") + ": " + safe.quoted_sql(descr) + "/" + sum]};        }
        else
        { // Bestaande factuurregel
          // finUpd heeft na afloop handige oldjsvals
          var finUpd = buildTrackingUpdate("fin_factuurregel", " fin_factuurregel_key = " + regel_key, regelfields);
          if (!isNew && finUpd.trackarray.length > 0)
          {
            if (descr != "")
              finUpdTrackarray = finUpdTrackarray.concat([descr + ": "]); // Omschrijving van de regel noteren zodat ik weet welke regel is aangepast.
            finUpdTrackarray = finUpdTrackarray.concat(finUpd.trackarray);
          }
          var new_regel_key = regel_key;
          // SUBMIT THE CHANGED DATA
          Oracle.Execute(finUpd.sql);
        }

        // Nu de kenmerken behorend bij de factuurregel opslaan
        var currentKenmerkenSQL = "SELECT f.fin_kenmerk_key"
                                + "     , f.fin_kenmerkfactregel_waarde"
                                + "     , k.fin_kenmerk_toonbaar"
                                + "     , k.fac_functie_key"
                                + "  FROM fin_kenmerkfactregel f"
                                + "     , fin_kenmerk k"
                                + " WHERE k.fin_kenmerk_key = f.fin_kenmerk_key"
                                + "   AND f.fin_kenmerkfactregel_verwijder IS NULL"
                                + "   AND f.fin_factuurregel_key = " + regel_key;

        var allKenmerkenSQL = "SELECT " + lcl.xsql('k.fin_kenmerk_omschrijving', 'k.fin_kenmerk_key') + " kenmerk_omschrijving"
                            + "     , k.fin_kenmerk_kenmerktype    kenmerk_kenmerktype"
                            + "     , k.fin_kenmerk_systeem        kenmerk_systeem"
                            + "     , k.fin_kenmerk_toonbaar       kenmerk_readonly"
                            + "     , k.fin_kenmerk_uniek          kenmerk_uniek"
                            + "     , k.fac_kenmerkdomein_key"
                            + "  FROM fin_kenmerk k"
                            + " WHERE k.fin_kenmerk_verwijder IS NULL"
                            + "   AND k.fin_kenmerk_key = "; /* wordt in saveFlexkenmerken uitgebreid */

        var flextrackregel = saveFlexKenmerken(new_regel_key,
                                               { kenmerkTable: "fin_kenmerkfactregel",
                                                 kenmerkParentKey : "fin_factuurregel_key",
                                                 kenmerkWaarde: "fin_kenmerkfactregel_waarde",
                                                 kenmerkKey: "fin_kenmerk_key",
                                                 kenmerkToonbaar: "fin_kenmerk_toonbaar",
                                                 currentKenmerkenSQL: currentKenmerkenSQL,
                                                 allKenmerkenSQL: allKenmerkenSQL,
                                                 requestQF: Request.Form,
                                                 nameprefix: (regel_key == -1? regel_id : "flex" + regel_key) + "_",
                                                 extraserie: true,
                                                 isNew: (regel_key < 0),
                                                 flexPath: "FIN/F",
                                                 tracking: true, // allKenmerkenSQL en module zijn dan verplicht.
                                                 module: "FIN",
                                                 noAttachments: true // Factuurregels hebben geen bijlages of bestanden.
                                                });
        flextrackregels = flextrackregels.concat(flextrackregel);
      }
    }
    frnum++
  }
}

if (!isNew)
{
  var fin_factuur_new = fin.factuur_info(fin_key);
  if (fin_factuur_old.fin_totaal != fin_factuur_new.fin_totaal)
    finUpdTrackarray.push(L("lcl_fin_total_sum_inBTW") + ": " + safe.curr(fin_factuur_old.fin_totaal + fin_factuur_old.fin_totaal_btw) + " => " + safe.curr(fin_factuur_new.fin_totaal + fin_factuur_new.fin_totaal_btw))
  if (fin_factuur_old.fin_totaal_btw != fin_factuur_new.fin_totaal_btw)
    finUpdTrackarray.push(L("lcl_fin_BTW_total_sum") + ": " + safe.curr(fin_factuur_old.fin_totaal_btw) + " => " + safe.curr(fin_factuur_new.fin_totaal_btw))
}

// Nu de algemene kenmerken opslaan
currentKenmerkenSQL = "SELECT kf.fin_kenmerk_key"
                    + "     , kf.fin_kenmerkfactuur_waarde"
                    + "     , k.fin_kenmerk_toonbaar"
                    + "     , k.fac_functie_key"
                    + "  FROM fin_kenmerkfactuur kf"
                    + "     , fin_kenmerk k"
                    + " WHERE k.fin_kenmerk_key = kf.fin_kenmerk_key"
                    + "   AND fin_kenmerkfactuur_verwijder IS NULL"
                    + "   AND fin_factuur_key = " + fin_key;

var allKenmerkenSQL = " SELECT " + lcl.xsql('k.fin_kenmerk_omschrijving', 'k.fin_kenmerk_key') + " kenmerk_omschrijving"
                    + "      , k.fin_kenmerk_key            srtkenmerk_key"
                    + "      , k.fin_kenmerk_kenmerktype    kenmerk_kenmerktype"
                    + "      , k.fin_kenmerk_systeem        kenmerk_systeem"
                    + "      , k.fin_kenmerk_toonbaar       kenmerk_readonly"
                    + "      , k.fin_kenmerk_uniek          kenmerk_uniek"
                    + "      , k.fac_kenmerkdomein_key"
                    + "   FROM fin_kenmerk k"
                    + "  WHERE k.fin_kenmerk_verwijder IS NULL"
                    + "    AND k.fin_kenmerk_key = "; /* wordt in saveFlexkenmerken uitgebreid */

var flextrack = saveFlexKenmerken(fin_key, { kenmerkTable: "fin_kenmerkfactuur",
                                             kenmerkParentKey : "fin_factuur_key",
                                             kenmerkWaarde: "fin_kenmerkfactuur_waarde",
                                             kenmerkKey: "fin_kenmerk_key",
                                             kenmerkToonbaar: "fin_kenmerk_toonbaar",
                                             currentKenmerkenSQL: currentKenmerkenSQL,
                                             allKenmerkenSQL: allKenmerkenSQL,
                                             requestQF: Request.Form,
                                             isNew: isNew,
                                             flexPath: "FIN/F",
                                             tracking: true, // allKenmerkenSQL en module zijn dan verplicht.
                                             module: "FIN"
                                          });

if (!isNew) // update nog tracken
{
  fin.trackfactuurupdate(fin_key, L("lcl_fin_is_finupdtrack").format(fin_key)
                                + ((finUpdTrackarray.length + flextrackregels.length + flextrack.length) > 0? "\n" : "")
                                + finUpdTrackarray.concat(flextrackregels.concat(flextrack)).join("\n"));
};

// Autofiatteer de factuur als dat zo ingesteld is
sql = "BEGIN fin.autoapprovefactuur(" + fin_key + "); END;";
Oracle.Execute(sql);

// Klantspecifieke check functie (hookfunction) voor de invoer
var pResult = new HookResult();
if (!custfunc.fin_postsave(fin_key, pResult))
{
  abort_with_warning(pResult.errmsg);
}
%>

<html>
  <head>
<%  FCLTHeader.Generate() %>
    <script>
      var doneParams = { fin_key: <%=fin_key%> };
      $(function () { FcltMgr.closeDetail(window, doneParams) });
    </script>
  </head>
  <body id="info">
  </body>
</html>

<% ASPPAGE_END(); %>
