paheko-fork/tools/extract-paypal-csv.php
2024-01-19 16:39:49 +01:00

163 lines
3.2 KiB
PHP
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Extracteur de données des relevés de compte Paypal
* à destination de Garradin (ou autre logiciel de compta)
*
* https://garradin.eu/
*
* Ce script prend en argument un fichier CSV exporté de Paypal
* https://business.paypal.com/merchantdata/reportHome?reportType=DLOG
* et produit un import exploitable dans Garradin
*
* Copyright (C) 2020 BohwaZ - licence AGPLv3
*/
if (empty($argv[1]) || empty($argv[2])) {
printf("Usage: %s FICHIER_PAYPAL_CSV FICHIER_SORTIE_CSV\n", $argv[0]);
exit(1);
}
$path = $argv[1];
$dest = $argv[2];
if (!is_readable($path)) {
die("Ne peut lire le répertoire\n");
}
$path = rtrim($path, '/');
$header = null;
$sum_header = null;
$out = [];
$i = 0;
if (!is_file($path)) {
die("Le fichier Paypal est invalide\n");
}
// Lecture du CSV
printf("Lecture de %s…" . PHP_EOL, $path);
/*
Date
Heure
Fuseau horaire
Nom
Type
État
Devise
Avant commission
Commission
Net
De l'adresse email
À l'adresse email
Numéro de transaction
Adresse de livraison
État de l'adresse
Titre de l'objet
Numéro de l'objet
Montant des frais d'expédition et de traitement
Montant de l'assurance
TVA
Nom de l'option 1
Valeur de l'option 1
Nom de l'option 2
Valeur de l'option 2
Numéro de la transaction de référence
Numéro de facture
Numéro de client
Quantité
Numéro de reçu
Solde
Adresse
Adresse (suite)/District/Quartier
Ville
État/Province/Région/Comté/Territoire/Préfecture/République
Code postal
Pays
Numéro de téléphone du contact
Objet
Remarque
Indicatif pays
Impact sur le solde
*/
$header = null;
$bom = "\xef\xbb\xbf";
// Read file from beginning.
$fp = fopen($path, 'r');
// Progress file pointer and get first 3 characters to compare to the BOM string.
if (fgets($fp, 4) !== $bom) {
// BOM not found - rewind pointer to start of file.
rewind($fp);
}
$l = 0;
static $required = ['Date', 'Nom', 'Type', 'Commission', 'Net', 'Objet', 'Remarque', 'Numéro de transaction'];
while (!feof($fp)) {
$l++;
$row = fgetcsv($fp);
if (!$row) {
break;
}
if (null === $header) {
$header = $row;
continue;
}
$c = (object) array_combine($header, $row);
foreach ($required as $key) {
if (!isset($c->$key)) {
printf('Colonne "%s" manquante sur ligne %d' . PHP_EOL, $key, $l);
continue(2);
}
}
$out[] = $c;
}
fclose($fp);
// Création du CSV de sortie
$fp = fopen($dest, 'w');
fputcsv($fp, ['Numéro d\'écriture', 'Date', 'Libellé', 'Compte de débit', 'Compte de crédit', 'Montant', 'Numéro pièce comptable', 'Référence paiement', 'Notes']);
static $notes_keys = ['Nom', 'Objet', 'Remarque'];
foreach ($out as $c) {
$label = $c->Type;
if ($c->Nom) {
$label = $c->Nom . ' - ' . $label;
}
$notes = '';
$ref = $c->{'Numéro de transaction'};
foreach ($notes_keys as $k) {
if ($c->{$k}) {
$notes .= $c->{$k} . "\n";
}
}
$notes = trim($notes);
if ($c->Commission != '0,00') {
$amount = preg_replace('/\s+/U', '', $c->Commission);
fputcsv($fp, ['', $c->Date, 'Commission PayPal sur transaction', '', '', $amount, '', $ref, $notes]);
}
$amount = preg_replace('/[\s ]+/U', '', $c->{'Avant commission'});
fputcsv($fp, ['', $c->Date, $label, '', '', $amount, '', $ref, $notes]);
}
fclose($fp);