Forum d'entraide Acomba
Pourquoi ne pas devenir membre du forum ?

Identifiez-vous ou Inscrivez-vous afin d'accéder à l'inrégralité du forum:
Accès à toutes les catégories du forum,
Entraide entre les 6 500 membres, et ce nombre s'accroît quotidiennement!

Notez que ce forum est indépendant de la société Acceo Solutions, éditrice du logiciel Acomba.

Rejoignez le forum, c’est rapide et facile

Forum d'entraide Acomba
Pourquoi ne pas devenir membre du forum ?

Identifiez-vous ou Inscrivez-vous afin d'accéder à l'inrégralité du forum:
Accès à toutes les catégories du forum,
Entraide entre les 6 500 membres, et ce nombre s'accroît quotidiennement!

Notez que ce forum est indépendant de la société Acceo Solutions, éditrice du logiciel Acomba.
Forum d'entraide Acomba
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Connexion
Le deal à ne pas rater :
Jeux, jouets et Lego : le deuxième à -50% (large sélection)
Voir le deal

Aller en bas
avatar
will
Nombre de messages : 9
Date d'inscription : 29/09/2021

Fiche d'Entreprise
Nom de l'entreprise:

ReserveCard() :  Filer error : 42 Procedure : 0 Sub proc : 3 Empty ReserveCard() : Filer error : 42 Procedure : 0 Sub proc : 3

Lun 18 Oct 2021 - 23:04
J'essaie d'enregistrer un paiement aux comptes payables et j'obtiens l'erreur 196649 qui dit :

Filer error : 42
Procesude : 0
Sub proc : 3

En somme, j'essaie de faire ce qui suit :

Code:

var paymentNumber=1000;
var payment = new PaymentAP {
    PaPaymentNumber = paymentNumber,
    PaBankNumber = _charter.ChNumber,
    PaType = PaymentAPType.PA_DirectDeposit,
    PaSupplierNumber = _supplier.SuNumber,
    PaDate = source.PaymentDate,
    PAAmount = source.TotalPayment,
    PaCurrentDay = 1,
    PaArchived = 0
};

int isBeingCreated = 2147483647; // Constante Acomba pour la création de nouvelle fiche.
var result = payment.ReserveCard(isBeingCreated);
// Et ici, 'result' obtient la valeur 196649, à partir de laquelle j'obtiens le message d'erreur incompréhensible.
if (result != 0) {
    payment.FreeCard();
    payment.FreeCardNumber();
    throw new AcombaException($"{_acomba.GetErrorMessage(result)}");
}

J'ai aussi essayé en assignant les trois valeurs de clé primaire, en usant de la méthode payment.ReserveCardNumber(), et rien ne fonctionne.  Au premier abord, ça me dit que le numéro existe déjà.  Or j'essaie d'utiliser un nouveau numéro pour payment.PaPaymentNumber, et ça refait l'erreur non compréhensible.
avatar
will
Nombre de messages : 9
Date d'inscription : 29/09/2021

Fiche d'Entreprise
Nom de l'entreprise:

ReserveCard() :  Filer error : 42 Procedure : 0 Sub proc : 3 Empty Re: ReserveCard() : Filer error : 42 Procedure : 0 Sub proc : 3

Mar 19 Oct 2021 - 14:41
Cette erreur survient lorsque le positionnement excède la capacité du filer sous-jacent au stockage de l'information d'Acomba.

Or pour éviter que cela survienne, il est impératif de bien positionner les indexes de sorte que le paiement sache vraiment toutes les positions de chacunes des interfaces avec lesquelles il interragi.

Voici donc un essai fonctionnel automatisé à partir duquel j'ai pu enregistrer un paiement fournisseur qui a su bien se dérouler.

Code:

using AcoSDK_Net;

using EdCapture.AcombaStd.acomba;

using FluentAssertions;

using Microsoft.VisualStudio.TestTools.UnitTesting;

using System;

namespace EdCapture.AcombaStd.Tests.features.suppliers {
    [TestClass]
    public class PaymentAdviceTests {
        [TestClass]
        public class FunctionalTests : PaymentAdviceTests {
            private readonly IAcoSDKX _sdk;
            private readonly IAcombaX _acomba;
            private readonly IUser _currentUser;
            public FunctionalTests() {
                _sdk = new AcoSDKX();
                _acomba = new AcombaX();
                _currentUser = new User();
            }

            public const string ApplicationPath = @"c:\aco_sdk";
            public const string CompanyPath = @"c:\f1000.dta\demosdk_en";
            public const string Username = "Supervisor";
            public const string UserPass = "DEMO";

            [TestInitialize]
            public void Initialize() {
                var version = _sdk.VaVersionSDK;
                var result = _sdk.Start(version);
                if (result != 0) throw new AcombaException($"Acomba SDK version {version} could not start. Error: {_acomba.GetErrorMessage(result)}.");

                result = _acomba.OpenCompany(ExecPath: ApplicationPath, DataPath: CompanyPath);
                if (result != 0) throw new AcombaException($"Acomba company could not be opened.  Company Data Path: {CompanyPath}. Error: {_acomba.GetErrorMessage(result)}.");

                _currentUser.PKey_UsNumber = Username;
                result = _currentUser.FindKey(Index: 1, GetCard: true);
                if (result != 0) throw new AcombaException($"Acomba user {Username} could not be found. Error: {_acomba.GetErrorMessage(result)}.");

                result = _acomba.LogCurrentUser(_currentUser.CardPos, UserPass);
                if (result != 0) throw new AcombaException($"Acomba user {Username} could not login. Error: {_acomba.GetErrorMessage(result)}.");
            }

            [TestCleanup]
            public void Cleanup() => _acomba.CloseCompany();

            [TestMethod]
            public void Should_RegisterPaymentFor_SupplierInvoice() {
                // Acomba's constant to create a new card interface.
                // According to the official documentation: This value must be assigned to the CardPos parameter of the ModifyCard method.
                const int IsBeingCreated = 2147483647;                
                var supplier = FindSupplier("5582092");
                var invoice = FindSupplierInvoice("45");
                var charter = FindBankAccount(1010);
                var paymentLine = new PaymentAPLine();
                var payment = GeneratePayment();
                int result;

                var cardPos = payment.Key_PaCardPos;
                var generated = payment.PaPaymentNumber;

                result = payment.ReserveCard(IsBeingCreated);
                if (!IsSuccess()) {
                    payment.FreeCardNumber();
                    payment.FreeCard();
                    throw new AcombaException($"{_acomba.GetErrorMessage(result)}.");
                }

                result = paymentLine.PayInvoice(payment.CardPos, invoice.CardPos, Math.Round(invoice.InAmount, 2), Discount: 0.00);
                if (!IsSuccess()) throw new AcombaException($"{_acomba.GetErrorMessage(result)}");

                payment.PAAmount -= invoice.InAmount;

                payment.ModifyCard(FreeIt: true);

                FindSupplierInvoice("45");
                var isAllPaid = invoice.InAllPaid != 0;

                isAllPaid.Should().BeTrue();

                result = payment.DeleteCard();
                if (!IsSuccess()) throw new AcombaException($"{_acomba.GetErrorMessage(result)}.");

                ICharter FindBankAccount(int number) {
                    charter = new Charter { PKey_ChNumber = number };
                    charter.GetFromPrimaryKey();
                    return charter;
                }
                IPaymentAP GeneratePayment() {
                    payment = new PaymentAP {
                        PaType = PaymentAPType.PA_DirectDeposit,
                        PaDate = DateTime.Today,
                        PaBankNumber = charter.ChNumber,
                        PaBankCP = charter.Key_ChCardPos,
                        PaCurrentDay = 1,
                        PaPayable = supplier.SuAccountPayable,
                        PaSupplierNumber = supplier.PKey_SuNumber,
                        PaSupplierCP = supplier.Key_SuCardPos,
                        PAAmount = 8000
                    };
                    payment.PaPaymentNumber = GenerateDirectDepositPaymentNumber();

                    return payment;
                }
                ISupplier FindSupplier(string number) {
                    supplier = new Supplier { PKey_SuNumber = number };
                    supplier.GetFromPrimaryKey();
                    return supplier;
                }
                IInvoiceAP FindSupplierInvoice(string number) {
                    invoice = new InvoiceAP {
                        Key_InInvoiceNumber = number,
                        Key_InSupplierCP = supplier.Key_SuCardPos,
                    };
                    invoice.FindKey(Index: 1, GetCard: true);
                    return invoice;
                }
                int GenerateDirectDepositPaymentNumber() {
                    var pap = new PaymentAP();
                    result = pap.LastKey(Index: 6, GetCard: true);

                    if (!IsSuccess())
                        throw new AcombaException($"Unable to generate direct deposit number.  Error:  {_acomba.GetErrorMessage(result)}.");

                    var nextDirectDepositPaymentNumber = pap.PaPaymentNumber + 1;
                    return nextDirectDepositPaymentNumber;
                }
                bool IsSuccess() => 0 == result;
            }
        }
    }
}

La seule erreur à laquelle je suis confronté en ce moment est la génération du numéro de paiement.  J'essaie d'obtenir le dernier numéro généré pour le type de paiement dépôt direct PaymentAPType.PA_DirectDeposit.

Lors de l'enregistrement d'un paiement paiement de type comptant (PaymentAPType.PA_CashReceipt), Acomba génère un numéro de manière automatique.  Mais pour un paiement de type chèque ou dépôt direct (PaymentAPType.PA_Check, PaymentAPType.PA_DirectDeposit), le numéro doit être assigné par programmation.  Par ailleurs, si le numéro de paiement existe déjà, Acomba refusera de réserver la carte (PaymentAP.ReserveCard(IsBeingCreated)) sous prétexte que le numéro est déjà utilisé.

Or je dois trouver une stratégie de génération.  Mon idée serait d'obtenir le dernier numéro de paiement pour le type de paiement généré, soit le dernier numéro de paiement pour PaymentAPType.PA_DirectDeposit, et l'incérmenter de un afin d'assurer le suivi comme ce qu'Acomba fait par défaut.

Selon la documentaiton officielle :

PaPaymentNumber  
Payment number. A value must be assigned to this property when creating a new payment card of type Check or Direct deposit (PaType = PA_Check or PA_DirectDeposit). For the Cash payment type (PaType = PA_CashReceipt), the system automatically assigns the appropriate value. This property must always be equal to the PK_CheckNumber value.

Or si qqn sait faire cette requête, la solution serait grandement appréciée.
Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum