From e55a86ccca3007b1c438271f385d81f920eaf8bf Mon Sep 17 00:00:00 2001 From: metacube Date: Thu, 4 Jun 2026 15:24:31 +0200 Subject: [PATCH] Add Spain all-in-one export upload script --- .../SageSpainFinalExportPackage/README.txt | 15 + .../Run-SpainExportAndUpload.ps1 | 39 ++- ...Run-SpainRangeExportAndUpload-AllInOne.ps1 | 303 ++++++++++++++++++ .../SageSpainFinalExportPackage.zip | Bin 0 -> 10073 bytes .../Start-SpainRangeExportAndUpload.ps1 | 46 +++ 5 files changed, 401 insertions(+), 2 deletions(-) create mode 100644 TrafagSalesExporter/SageSpainFinalExportPackage/Run-SpainRangeExportAndUpload-AllInOne.ps1 create mode 100644 TrafagSalesExporter/SageSpainFinalExportPackage/SageSpainFinalExportPackage.zip create mode 100644 TrafagSalesExporter/SageSpainFinalExportPackage/Start-SpainRangeExportAndUpload.ps1 diff --git a/TrafagSalesExporter/SageSpainFinalExportPackage/README.txt b/TrafagSalesExporter/SageSpainFinalExportPackage/README.txt index 97d4173..9fa4850 100644 --- a/TrafagSalesExporter/SageSpainFinalExportPackage/README.txt +++ b/TrafagSalesExporter/SageSpainFinalExportPackage/README.txt @@ -94,6 +94,21 @@ Explicit range: .\Run-SpainExportAndUpload.ps1 -ExportMode Range -DateFilter LineRegistrationDate -FromDate "2026-06-02" -ToDate "2026-06-03" +Simple starter script with default test range 2026-06-01 until 2026-06-04: + +.\Start-SpainRangeExportAndUpload.ps1 + +Same starter script with another range: + +.\Start-SpainRangeExportAndUpload.ps1 -FromDate "2026-06-01" -ToDate "2026-06-04" + +Single-file all-in-one range export and upload. +This file does not require Export-SageSpainSalesCsv.ps1 or Run-SpainExportAndUpload.ps1: + +.\Run-SpainRangeExportAndUpload-AllInOne.ps1 -FromDate "2026-06-01" -ToDate "2026-06-04" + +The all-in-one script checks/creates the SharePoint folder before export, uploads the generated CSV and summary, and verifies that the uploaded files are listed in SharePoint. + Full export and upload: .\Run-SpainExportAndUpload.ps1 -ExportMode Full -Year 2025 diff --git a/TrafagSalesExporter/SageSpainFinalExportPackage/Run-SpainExportAndUpload.ps1 b/TrafagSalesExporter/SageSpainFinalExportPackage/Run-SpainExportAndUpload.ps1 index 7b5f715..b6e8b55 100644 --- a/TrafagSalesExporter/SageSpainFinalExportPackage/Run-SpainExportAndUpload.ps1 +++ b/TrafagSalesExporter/SageSpainFinalExportPackage/Run-SpainExportAndUpload.ps1 @@ -26,6 +26,24 @@ $outputDirectory = Join-Path $BaseDirectory "out" $logDirectory = Join-Path $BaseDirectory "logs" New-Item -ItemType Directory -Force -Path $outputDirectory, $logDirectory | Out-Null +if (-not (Get-Command $RcloneExe -ErrorAction SilentlyContinue)) { + throw "rclone executable not found: $RcloneExe" +} + +$target = "${RcloneRemote}:$RcloneTarget" +$rcloneLog = Join-Path $logDirectory ("rclone-spain-" + (Get-Date -Format "yyyyMMdd") + ".log") + +Write-Host "Checking SharePoint target with rclone: $target" +& $RcloneExe mkdir $target --log-file $rcloneLog --log-level INFO +if ($LASTEXITCODE -ne 0) { + throw "Could not create/check SharePoint target '$target'. rclone exit code $LASTEXITCODE. Log: $rcloneLog" +} + +& $RcloneExe lsf $target --max-depth 1 --log-file $rcloneLog --log-level INFO | Out-Null +if ($LASTEXITCODE -ne 0) { + throw "SharePoint target '$target' is not reachable. rclone exit code $LASTEXITCODE. Log: $rcloneLog" +} + $exportArgs = @( "-ServerInstance", $ServerInstance, "-Database", $Database, @@ -54,18 +72,35 @@ if ($null -eq $latestRun) { throw "No export run directory found in $outputDirectory" } -$rcloneLog = Join-Path $logDirectory ("rclone-spain-" + (Get-Date -Format "yyyyMMdd") + ".log") -$target = "${RcloneRemote}:$RcloneTarget" +$filesToUpload = Get-ChildItem -LiteralPath $latestRun.FullName -File | + Where-Object { $_.Name -like "*.csv" -or $_.Name -like "*_summary.txt" } +if ($filesToUpload.Count -eq 0) { + throw "No CSV or summary files found for upload in $($latestRun.FullName)" +} + +Write-Host "Uploading $($filesToUpload.Count) file(s) to SharePoint target: $target" & $RcloneExe copy $latestRun.FullName $target ` --include "*.csv" ` --include "*_summary.txt" ` + --verbose ` --log-file $rcloneLog ` --log-level INFO if ($LASTEXITCODE -ne 0) { throw "rclone upload failed with exit code $LASTEXITCODE" } +foreach ($file in $filesToUpload) { + $uploadedMatch = & $RcloneExe lsf $target --files-only --include $file.Name --log-file $rcloneLog --log-level INFO + if ($LASTEXITCODE -ne 0) { + throw "Could not verify uploaded file '$($file.Name)' in '$target'. rclone exit code $LASTEXITCODE. Log: $rcloneLog" + } + + if (-not ($uploadedMatch | Where-Object { $_ -eq $file.Name })) { + throw "Upload verification failed. File '$($file.Name)' was not listed in '$target'. Log: $rcloneLog" + } +} + Write-Host "Spain export and upload finished." Write-Host "Local export: $($latestRun.FullName)" Write-Host "SharePoint target: $target" diff --git a/TrafagSalesExporter/SageSpainFinalExportPackage/Run-SpainRangeExportAndUpload-AllInOne.ps1 b/TrafagSalesExporter/SageSpainFinalExportPackage/Run-SpainRangeExportAndUpload-AllInOne.ps1 new file mode 100644 index 0000000..432afa9 --- /dev/null +++ b/TrafagSalesExporter/SageSpainFinalExportPackage/Run-SpainRangeExportAndUpload-AllInOne.ps1 @@ -0,0 +1,303 @@ +param( + [string]$ServerInstance = "localhost", + [string]$Database = "Sage", + [ValidateSet("InvoiceDate", "LineRegistrationDate")] + [string]$DateFilter = "LineRegistrationDate", + [datetime]$FromDate = "2026-06-01", + [datetime]$ToDate = "2026-06-04", + [string]$BaseDirectory = "C:\Trafag\SageSpain", + [string]$RcloneExe = "C:\Tools\rclone.exe", + [string]$RcloneRemote = "trafag-bi", + [string]$RcloneTarget = "Import/Finance/Spanien" +) + +$ErrorActionPreference = "Stop" + +function New-Connection { + $builder = New-Object System.Data.SqlClient.SqlConnectionStringBuilder + $builder["Data Source"] = $ServerInstance + $builder["Initial Catalog"] = $Database + $builder["Integrated Security"] = $true + $builder["TrustServerCertificate"] = $true + $builder["Connect Timeout"] = 15 + return New-Object System.Data.SqlClient.SqlConnection($builder.ConnectionString) +} + +function Convert-ToCsvValue { + param($Value) + + if ($null -eq $Value -or $Value -is [System.DBNull]) { + return "" + } + + if ($Value -is [datetime]) { + $text = $Value.ToString("yyyy-MM-dd HH:mm:ss") + } + else { + $text = [string]$Value + } + + $text = $text.Replace('"', '""') + return '"' + $text + '"' +} + +function Export-QueryToCsv { + param( + [string]$Sql, + [string]$Path + ) + + $conn = New-Connection + $cmd = $conn.CreateCommand() + $cmd.CommandText = $Sql + $cmd.CommandTimeout = 0 + + $fromParameter = $cmd.Parameters.Add("@FromDate", [System.Data.SqlDbType]::Date) + $fromParameter.Value = $FromDate.Date + + $toParameter = $cmd.Parameters.Add("@ToDate", [System.Data.SqlDbType]::Date) + $toParameter.Value = $ToDate.Date + + $writer = New-Object System.IO.StreamWriter($Path, $false, [System.Text.Encoding]::UTF8) + $rowCount = 0 + $salesSum = [decimal]0 + + try { + $conn.Open() + $reader = $cmd.ExecuteReader() + + $headers = for ($i = 0; $i -lt $reader.FieldCount; $i++) { + Convert-ToCsvValue $reader.GetName($i) + } + $writer.WriteLine(($headers -join ";")) + + $salesIndex = -1 + for ($i = 0; $i -lt $reader.FieldCount; $i++) { + if ($reader.GetName($i) -eq "SalesPriceValue") { + $salesIndex = $i + break + } + } + + while ($reader.Read()) { + $values = for ($i = 0; $i -lt $reader.FieldCount; $i++) { + Convert-ToCsvValue $reader.GetValue($i) + } + $writer.WriteLine(($values -join ";")) + $rowCount++ + + if ($salesIndex -ge 0 -and -not $reader.IsDBNull($salesIndex)) { + $salesSum += [decimal]$reader.GetValue($salesIndex) + } + } + } + finally { + $writer.Dispose() + $conn.Dispose() + } + + return [pscustomobject]@{ + Rows = $rowCount + SalesPriceValueSum = $salesSum + } +} + +if ($ToDate.Date -le $FromDate.Date) { + throw "ToDate must be later than FromDate. FromDate=$($FromDate.ToString("yyyy-MM-dd")), ToDate=$($ToDate.ToString("yyyy-MM-dd"))" +} + +if (-not (Test-Path -LiteralPath $RcloneExe)) { + throw "rclone executable not found: $RcloneExe" +} + +$outputDirectory = Join-Path $BaseDirectory "out" +$logDirectory = Join-Path $BaseDirectory "logs" +New-Item -ItemType Directory -Force -Path $outputDirectory, $logDirectory | Out-Null + +$target = "${RcloneRemote}:$RcloneTarget" +$rcloneLog = Join-Path $logDirectory ("rclone-spain-" + (Get-Date -Format "yyyyMMdd") + ".log") + +Write-Host "Checking SharePoint target with rclone: $target" +& $RcloneExe mkdir $target --log-file $rcloneLog --log-level INFO +if ($LASTEXITCODE -ne 0) { + throw "Could not create/check SharePoint target '$target'. rclone exit code $LASTEXITCODE. Log: $rcloneLog" +} + +$targetListing = & $RcloneExe lsf $target --max-depth 1 --log-file $rcloneLog --log-level INFO +if ($LASTEXITCODE -ne 0) { + throw "SharePoint target '$target' is not reachable. rclone exit code $LASTEXITCODE. Log: $rcloneLog" +} +Write-Host "SharePoint target reachable. Existing items: $(@($targetListing).Count)" + +$timestamp = Get-Date -Format "yyyyMMdd_HHmmss" +$runDirectory = Join-Path $outputDirectory "Sage_Spain_Sales_Export_$timestamp" +New-Item -ItemType Directory -Path $runDirectory -Force | Out-Null + +$fromToken = $FromDate.ToString("yyyyMMdd") +$toToken = $ToDate.Date.AddDays(-1).ToString("yyyyMMdd") +$outputFileName = "Spain_Sales_range_${fromToken}_to_${toToken}.csv" +$csvPath = Join-Path $runDirectory $outputFileName +$summaryPath = Join-Path $runDirectory ([System.IO.Path]::GetFileNameWithoutExtension($outputFileName) + "_summary.txt") + +$datePredicate = if ($DateFilter -eq "LineRegistrationDate") { + "COALESCE(l.FechaRegistro, c.FechaFactura) >= @FromDate + AND COALESCE(l.FechaRegistro, c.FechaFactura) < @ToDate" +} else { + "c.FechaFactura >= @FromDate + AND c.FechaFactura < @ToDate" +} + +$sql = @" +SELECT + 'TRES' AS TSC, + 'Spanien' AS Land, + 'Sage' AS SourceSystem, + c.CodigoEmpresa AS CompanyCode, + c.EjercicioAlbaran AS DeliveryYear, + c.SerieAlbaran AS DeliverySeries, + c.NumeroAlbaran AS DeliveryNumber, + c.EjercicioFactura AS InvoiceYear, + c.SerieFactura AS InvoiceSeries, + c.NumeroFactura AS InvoiceNumber, + l.Orden AS PositionOnInvoice, + l.LineasPosicion AS SourceLineId, + l.CodigoArticulo AS Material, + l.DescripcionArticulo AS Name, + l.Descripcion2Articulo AS Description2, + l.DescripcionLinea AS DescriptionLine, + l.CodigoFamilia AS ProductGroup, + l.CodigoSubfamilia AS ProductSubGroup, + CAST(l.Unidades AS decimal(19, 6)) AS Quantity, + c.CodigoCliente AS CustomerNumber, + c.Nombre AS CustomerName, + c.CodigoNacion AS CustomerCountryCode, + c.Nacion AS CustomerCountry, + CAST(l.PrecioCoste AS decimal(19, 6)) AS StandardCost, + CAST(l.ImporteCoste AS decimal(19, 6)) AS StandardCostValue, + 'EUR' AS StandardCostCurrency, + CAST(CASE + WHEN c.TipoNuevaFra = 2 OR c.SerieFactura = 'REC' OR c.StatusAbono <> 0 THEN -ABS(l.ImporteNeto) + ELSE l.ImporteNeto + END AS decimal(19, 6)) AS SalesPriceValue, + 'EUR' AS SalesCurrency, + 'EUR' AS DocumentCurrency, + 'EUR' AS CompanyCurrency, + c.CodigoDivisa AS SageCurrencyCode, + CAST(CASE + WHEN c.TipoNuevaFra = 2 OR c.SerieFactura = 'REC' OR c.StatusAbono <> 0 THEN -ABS(c.BaseImponible) + ELSE c.BaseImponible + END AS decimal(19, 6)) AS DocumentNetAmount, + CAST(c.TotalIva AS decimal(19, 6)) AS DocumentVatAmount, + CAST(c.ImporteFactura AS decimal(19, 6)) AS DocumentGrossAmount, + c.FechaFactura AS InvoiceDate, + c.FechaAlbaran AS DeliveryDate, + l.FechaRegistro AS LineRegistrationDate, + c.EjercicioPedido AS OrderYear, + c.SeriePedido AS OrderSeries, + c.NumeroPedido AS OrderNumber, + c.SuPedido AS PurchaseOrderNumber, + c.CodigoExportacion_ AS Incoterms2020, + c.CondicionExportacion_ AS IncotermsText, + c.CodigoComisionista AS SalesResponsibleEmployee, + c.StatusAbono AS CreditStatus, + c.NoFacturable AS NonBillable, + c.TipoNuevaFra AS InvoiceType, + c.StatusFacturado AS BillingStatus, + CASE + WHEN c.TipoNuevaFra = 2 OR c.SerieFactura = 'REC' OR c.StatusAbono <> 0 THEN 'Credit Note' + ELSE 'Invoice' + END AS DocumentType +FROM dbo.CabeceraAlbaranCliente c +JOIN dbo.LineasAlbaranCliente l + ON l.CodigoEmpresa = c.CodigoEmpresa + AND l.EjercicioAlbaran = c.EjercicioAlbaran + AND l.SerieAlbaran = c.SerieAlbaran + AND l.NumeroAlbaran = c.NumeroAlbaran +WHERE $datePredicate +ORDER BY + c.FechaFactura, + c.SerieFactura, + c.NumeroFactura, + l.Orden; +"@ + +Write-Host "Exporting Sage Spain range..." +Write-Host "FromDate: $($FromDate.ToString("yyyy-MM-dd"))" +Write-Host "ToDate: $($ToDate.ToString("yyyy-MM-dd"))" +Write-Host "DateFilter: $DateFilter" + +$result = Export-QueryToCsv -Sql $sql -Path $csvPath + +@" +Sage Spain Sales CSV export +=========================== + +Created: $(Get-Date -Format "yyyy-MM-dd HH:mm:ss") +Server instance: $ServerInstance +Database: $Database +Export mode: Range +Date filter mode: $DateFilter +From date: $($FromDate.ToString("yyyy-MM-dd")) +To date: $($ToDate.ToString("yyyy-MM-dd")) + +Output: +$csvPath + +Rows: +$($result.Rows) + +SalesPriceValue sum: +$($result.SalesPriceValueSum) + +SharePoint target: +$target + +Source: +dbo.CabeceraAlbaranCliente joined with dbo.LineasAlbaranCliente + +Filter: +$datePredicate + +Notes: +- ToDate is exclusive. +- Currency is set to EUR. +- SalesPriceValue uses LineasAlbaranCliente.ImporteNeto; credit notes are forced negative. +- Credit notes are marked when TipoNuevaFra=2, SerieFactura='REC', or StatusAbono is non-zero. +"@ | Set-Content -LiteralPath $summaryPath -Encoding UTF8 + +$filesToUpload = Get-ChildItem -LiteralPath $runDirectory -File | + Where-Object { $_.Name -like "*.csv" -or $_.Name -like "*_summary.txt" } +if ($filesToUpload.Count -eq 0) { + throw "No CSV or summary files found for upload in $runDirectory" +} + +Write-Host "Uploading $($filesToUpload.Count) file(s) to SharePoint target: $target" +& $RcloneExe copy $runDirectory $target ` + --include "*.csv" ` + --include "*_summary.txt" ` + --verbose ` + --log-file $rcloneLog ` + --log-level INFO +if ($LASTEXITCODE -ne 0) { + throw "rclone upload failed with exit code $LASTEXITCODE. Log: $rcloneLog" +} + +foreach ($file in $filesToUpload) { + $uploadedMatch = & $RcloneExe lsf $target --files-only --include $file.Name --log-file $rcloneLog --log-level INFO + if ($LASTEXITCODE -ne 0) { + throw "Could not verify uploaded file '$($file.Name)' in '$target'. rclone exit code $LASTEXITCODE. Log: $rcloneLog" + } + + if (-not ($uploadedMatch | Where-Object { $_ -eq $file.Name })) { + throw "Upload verification failed. File '$($file.Name)' was not listed in '$target'. Log: $rcloneLog" + } +} + +Write-Host "Spain range export and SharePoint upload finished." +Write-Host "Local export: $runDirectory" +Write-Host "CSV: $csvPath" +Write-Host "Summary: $summaryPath" +Write-Host "Rows: $($result.Rows)" +Write-Host "SalesPriceValue sum: $($result.SalesPriceValueSum)" +Write-Host "SharePoint target: $target" +Write-Host "rclone log: $rcloneLog" diff --git a/TrafagSalesExporter/SageSpainFinalExportPackage/SageSpainFinalExportPackage.zip b/TrafagSalesExporter/SageSpainFinalExportPackage/SageSpainFinalExportPackage.zip new file mode 100644 index 0000000000000000000000000000000000000000..0f4b438b72e42f0b1e88f7baf45a0c3e21dfaeb3 GIT binary patch literal 10073 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%0D?9LZ?(o8G({2ucHO*l`g3y2WCVKAylJ zSA4$LqwMS1j3@7{@D(r|RA8i7G>~Xsa7n}6EkBc|)uu}r;!}=M|B9MngIQciIU?}& zvk7sL_VXbs8ebB3)Nnj2zYuWH6O@KxApI$ZRM4;UeRKdF4qh@`vL~^65tJl)6G=W4 zrM@w{lx3fmZNFKpya%J=?ux|CoMN^3;MEPJcA#Bd2_GJh*n2-mo{mQwPq%FnjDf$13f5{`M)kd}m%BSq4Fbxr zqNzAmOXTQs^sMS${*=~M9hJ!3CG27{J1kQeR9-|Z8D)kd4A@qfzkPLP>+HlrfCb5J z01TClhM1x?ueTOgSMEEg_g~8QL>G9B7r48fSr7M~|FXl^)SPp@Vr)5{uQ}{q%x=by zk@qYRY)Ji$GHJDZO;E)T!z3xjT1L;>e3w>r$PQyJE7rJBBZ`2LUo8wc6GjERV^P5L z(#TKkozKw5UCnEq{hXEgmt$Sq*uTnW@B@s$})sj%cZO;Y@AOQxpGTtUmR`u zRP4y4U^}j{g-^YQ>%nOuAOz=2BD1Lj%6<*{!*R~}1=1m+NG;`_{H9*~ngP4oSofw1 zI}>A8U*%e56JOh;0B0g-mAcU`B-ac{sUr$4u>JNRAfHZcxB7Hg$bfPM%b`=tH`Q9Ya z2YltLS_Dz5jOx8tn#^dc4xBRiTMi`+Nbl+a`Ce*R7OBa@)^zJc-1?CS0H#whc@nV@ zPBNK~do&P>?(3p)io~LG8U?X47vhb?sQigSe*-fg>0m@a_cxvSP&gR{hU%%Nr6SU% z@Xo;~3sv0G%Ga3*`D!{C$b*Z<@WXl|#7NbbP667C7fT+jovkQoXaQglFX$Z;qRCKo ze6d%3Q6c1l^|1xnPeGe$oZQRNPR2TCvCY)ui}GU*llH~R(oHsl1Ugdfb56`Sd%<;( z+Dp1?ps*&E!Cb0mkcLlX1>_y~IG3?`ptO^SqU$|_(BSLTvkG-^F(;y*U$Z})?wgfQ z^UrW%np+V@JaN||i5K;zA|ZO#heAN#K(@LAopW} za|!E*-qlQdf6aDc(RS}L=3RMYw%N=%+}k~9{i(>~!4pUC<}-$md70>|s(sVi_Z(ZeG=E3ocK)cMy=Vrq(^El zjB8Qmxt-nnrWha+zXiJ5UO2L1Cc`y%Z$}oBx4rNP+_FK56U7sxMQ9E3W0)R>%hLf; zit!FVhiN?Uuk9D>$Jg9B29&xlg#!sv2oi%2bNiZWRT z4l)_+?C9cONB5Y23e!7imiUQI6cxao4|JtPE;e7E!?WdHdZQzCDKrn=^lvyZI!2K~ zZMP5g>lfaT*^+pYW(w`0qjn4foh>iY_SNngmx_|2aTQ~e$ c_mlXay-`UP66&u#$Un;s6a-|F@~^x90a`N0^8f$< literal 0 HcmV?d00001 diff --git a/TrafagSalesExporter/SageSpainFinalExportPackage/Start-SpainRangeExportAndUpload.ps1 b/TrafagSalesExporter/SageSpainFinalExportPackage/Start-SpainRangeExportAndUpload.ps1 new file mode 100644 index 0000000..869f84f --- /dev/null +++ b/TrafagSalesExporter/SageSpainFinalExportPackage/Start-SpainRangeExportAndUpload.ps1 @@ -0,0 +1,46 @@ +param( + [datetime]$FromDate = "2026-06-01", + [datetime]$ToDate = "2026-06-04", + [string]$ServerInstance = "localhost", + [string]$Database = "Sage", + [string]$BaseDirectory = "C:\Trafag\SageSpain", + [string]$RcloneExe = "C:\Tools\rclone.exe", + [string]$RcloneRemote = "trafag-bi", + [string]$RcloneTarget = "Import/Finance/Spanien" +) + +$ErrorActionPreference = "Stop" + +$scriptDirectory = Split-Path -Parent $MyInvocation.MyCommand.Path +$workflowScript = Join-Path $scriptDirectory "Run-SpainExportAndUpload.ps1" + +if (-not (Test-Path -LiteralPath $workflowScript)) { + throw "Workflow script not found: $workflowScript" +} + +if (-not (Test-Path -LiteralPath $RcloneExe)) { + throw "rclone not found: $RcloneExe" +} + +Write-Host "Starting Spain Sage range export and SharePoint upload..." +Write-Host "FromDate: $($FromDate.ToString("yyyy-MM-dd"))" +Write-Host "ToDate: $($ToDate.ToString("yyyy-MM-dd"))" +Write-Host "Target: ${RcloneRemote}:$RcloneTarget" + +& $workflowScript ` + -ServerInstance $ServerInstance ` + -Database $Database ` + -ExportMode Range ` + -DateFilter LineRegistrationDate ` + -FromDate $FromDate ` + -ToDate $ToDate ` + -BaseDirectory $BaseDirectory ` + -RcloneExe $RcloneExe ` + -RcloneRemote $RcloneRemote ` + -RcloneTarget $RcloneTarget + +if ($LASTEXITCODE -ne 0) { + throw "Spain range export and upload failed with exit code $LASTEXITCODE" +} + +Write-Host "Finished Spain Sage range export and SharePoint upload."