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 du moment : -21%
LEGO® Icons 10329 Les Plantes Miniatures, ...
Voir le deal
39.59 €

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

Fiche d'Entreprise
Nom de l'entreprise:

Erreur de ToolKit / ModifyCard / Transaction non balancée ? Empty Erreur de ToolKit / ModifyCard / Transaction non balancée ?

Mer 29 Sep 2021 - 14:41
Le service que j'écris traite des fichiers de transaction xml qu'il surveille dans un dossier paramétré en configuration.  Le xml contient l'information nécessaire et se sérialise en SupplierInvoice dans mon code.

Ensuite, utilisant AutoMapper, mon convertisseur de SupplierInvoice vers ITransAP fait le travail pour finir par ajouter la transaction de compte payable à Acomba.

Le code appelant de mon convertisseur :

Code:

    public class Acomba : ISupplierInvoiceHandler {
        private readonly IAcombaX _acomba;
        private readonly IMapper _mapper;
        public Acomba(IAcombaX acomba, IMapper mapper) {
            _acomba=acomba??throw new ArgumentNullException(nameof(acomba));
            _mapper=mapper??throw new ArgumentNullException(nameof(mapper));
        }

        public void Create(SupplierInvoice toCreate) {
            var arTrx=_mapper.Map<ITransAP>(toCreate);  // ce qui appelle mon convertisseur (voir code plus bas).
            var result=arTrx.ReserveCardNumber();
            if (result!=0) throw new AcombaException(_acomba.GetErrorMessage(result));
            result=arTrx.AddCard();
            if (result!=0) throw new AcombaException(_acomba.GetErrorMessage(result));  // c'est ici que l'erreur survient.
        }
    }

Erreur de ToolKit / ModifyCard / Transaction non balancée ? Screen10

Voici le convertisseur responsable du mapping entre les deux classes.

Code:

    public class SupplierInvoiceConverter : ITypeConverter<SupplierInvoice, IInvoiceAP>, ITypeConverter<SupplierInvoice, ITransAP> {
        private enum SearchKeys : int {
            SortKey=2,
        }

        private readonly ISupplier _supplier;
        private readonly IPayables _payables;
        private readonly ICharter _charter;
        private readonly IAcombaAccountsConfiguration _acombaAccountsConfiguration;
        public SupplierInvoiceConverter()
            : this(new Supplier(),new Payables(),new Charter(),new Configuration()) { }
        public SupplierInvoiceConverter(ISupplier supplier, IPayables payables, ICharter charter, IAcombaAccountsConfiguration acombaAccountsConfiguration) {
            _supplier = supplier ?? throw new ArgumentNullException(nameof(supplier));
            _payables = payables ?? throw new ArgumentNullException(nameof(payables));
            _charter = charter ?? throw new ArgumentNullException(nameof(charter));
            _acombaAccountsConfiguration = acombaAccountsConfiguration ?? throw new ArgumentNullException(nameof(acombaAccountsConfiguration));
        }

        public IInvoiceAP Convert(SupplierInvoice source, IInvoiceAP destination, ResolutionContext context) {
            if (source == null) return null;

            if (!SupplierIsFound(source.Supplier))
                throw new AcombaException($"Supplier '{source.Supplier}' could not be found.");

            destination = new InvoiceAP {
                InDate = source.InvoiceDate,
                InAmount = source.Total,
                InInvoiceNumber = source.Number,
                InType = InvoiceAPType.IT_Invoice,
                InSubTotal = source.Subtotal,
                InSupplierNumber = _supplier.SuNumber,
                InPayable = _payables.PaAccountPayableCP[_supplier.SuAccountPayable],
                InDescription = $"Facture {source.Number}",
            };

            return destination;
        }

        public ITransAP Convert(SupplierInvoice source, ITransAP destination, ResolutionContext context) {
            if (source == null) return null;

            if (!SupplierIsFound(source.Supplier))
                throw new AcombaException($"Supplier '{source.Supplier}' could not be found.");

            destination = new TransAP {
                PKey_InInvoiceNumber = source.Number,
                PKey_InSupplierCP = _supplier.CardPos,
                PKey_InSupplierPaidToCP = _supplier.SuPaidToCP,
                InInvoiceNumber = source.Number,
                InSupplierCP = _supplier.CardPos,
                InType = InvoiceAPType.IT_Invoice,
                InAmount = source.Total,
                InDate = source.InvoiceDate,
                InDescription = $"Facture {source.Number}",
                InPayable = 0,
                InCurrentDay = -1,
                TANumPosts = 4,
                InPaidToCP = _supplier.SuPaidToCP
            };

            destination.PACharterCP[0] = _payables.PaAccountPayableCP[_supplier.SuAccountPayable];
            destination.PADescription[0] = "Compte fournisseur";
            destination.PAAmount[0] = source.Total;
            destination.PAIsTax[0] = 0;
            destination.PAProjectNumber[0] = source.Project;

            if (!IsFoundWithinChartOfAccount(source.Account))
                throw new AcombaException($"Account '{source.Account}' could not be found.");

            destination.PACharterCP[1] = _charter.Key_ChCardPos;
            destination.PADescription[1] = _charter.ChDescription;
            destination.PAAmount[1] = source.Total;
            destination.PAIsTax[1] = 0;
            destination.PAProjectNumber[1] = source.Project;

            if (!IsFoundWithinChartOfAccount(_acombaAccountsConfiguration.InputTaxCreditAccountGST))
                throw new AcombaException($"Account '{_acombaAccountsConfiguration.InputTaxCreditAccountGST}' could not be found.");

            destination.PACharterCP[2] = _charter.Key_ChCardPos;
            destination.PADescription[2] = _charter.ChDescription;
            destination.PAAmount[2] = source.GST;
            destination.PAIsTax[2] = 1;
            destination.PAProjectNumber[2] = source.Project;

            if (!IsFoundWithinChartOfAccount(_acombaAccountsConfiguration.InputTaxRefundAccountPST))
                throw new AcombaException($"Account '{_acombaAccountsConfiguration.InputTaxRefundAccountPST}' could not be found.");

            destination.PACharterCP[3] = _charter.Key_ChCardPos;
            destination.PADescription[3] = _charter.ChDescription;
            destination.PAAmount[3] = source.PST;
            destination.PAIsTax[3] = 1;
            destination.PAProjectNumber[3] = source.Project;

            return destination;
        }

        private bool IsFoundWithinChartOfAccount(int accountNumber) {
            _charter.BlankCard();
            _charter.PKey_ChNumber = accountNumber;
            return 0 == _charter.FindKey(1, true);
        }

        private bool SupplierIsFound(string supplierNumber) {
            const int AcombaSortKeyMaxLength = 15;

            _supplier.BlankCard();
            _supplier.Key_SuSortKey = supplierNumber.Substring(startIndex:0, length:AcombaSortKeyMaxLength);

            var found = 0 == _supplier.SearchKey((int)SearchKeys.SortKey, true);
            return found;
        }
    }

Quelconque aide est appréciée.
avatar
will
Nombre de messages : 9
Date d'inscription : 29/09/2021

Fiche d'Entreprise
Nom de l'entreprise:

Erreur de ToolKit / ModifyCard / Transaction non balancée ? Empty Erreur de ToolKit / ModifyCard / Transaction non balancée ?

Ven 8 Oct 2021 - 21:23
Comme la première ligne d'écriture écrit dans le compte fournisseur qui est créditeur, et les trois autres lignes dans le compte de dépense du fournisseur, ainsi que dans les deux comptes de taxes à recevoir qui eux sont débiteurs, je devais mettre les comptes débiteurs négatifs comme suit.  Petit changement subtile, alors voir les lignes destination.PAAmount[index].  De plus, la deuxième ligne doit contenir le sous-total (source.Subtotal) plutôt que le total de la transaction (source.Total), alors que Total représente le montant total de la transaction, i.e. ce qui est payé au fournisseur, et le sous-total est bien entendu le montant hors taxes, additionné aux deux autres lignes de taxes qui correspond au montant saisi dans le compte fournisseur.

Code:

            destination.PACharterCP[1] = _payables.PaAccountPayableCP[_supplier.SuAccountPayable];
            destination.PADescription[1] = "Compte fournisseur";
            destination.PAAmount[1] = source.Total;
            destination.PAIsTax[1] = 0;
            destination.PAProjectNumber[1] = source.Project;

            if (!IsFoundWithinChartOfAccount(source.Account))
                throw new AcombaException($"Account '{source.Account}' could not be found.");

            destination.PACharterCP[2] = _charter.Key_ChCardPos;
            destination.PADescription[2] = _charter.ChDescription;
            destination.PAAmount[2] = -source.Subtotal;
            destination.PAIsTax[2] = 0;
            destination.PAProjectNumber[2] = source.Project;

            if (!IsFoundWithinChartOfAccount(_acombaAccountsConfiguration.InputTaxCreditAccountGST))
                throw new AcombaException($"Account '{_acombaAccountsConfiguration.InputTaxCreditAccountGST}' could not be found.");

            destination.PACharterCP[3] = _charter.Key_ChCardPos;
            destination.PADescription[3] = _charter.ChDescription;
            destination.PAAmount[3] = -source.GST;
            destination.PAIsTax[3] = 1;
            destination.PAProjectNumber[3] = source.Project;

            if (!IsFoundWithinChartOfAccount(_acombaAccountsConfiguration.InputTaxRefundAccountPST))
                throw new AcombaException($"Account '{_acombaAccountsConfiguration.InputTaxRefundAccountPST}' could not be found.");

            destination.PACharterCP[4] = _charter.Key_ChCardPos;
            destination.PADescription[4] = _charter.ChDescription;
            destination.PAAmount[4] = -source.PST;
            destination.PAIsTax[4] = 1;
            destination.PAProjectNumber[4] = source.Project;
Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum