Skocz do zawartości

Dodawanie pustego rekordu w ModelDanychContainer.Adresy podczas dodawania kontrahenta przez sferę.

Polecane posty

Witam,

Posiadamy aplikację 4Sales, przez którą można przy użyciu sfery dodawać kontrahentów (kod funkcji poniżej). Mamy problem u jednego z naszych klientów: podczas dodawania kontrahenta w bazie w tabeli ModelDanychContainer.Adresy powstaje jeden pusty rekord z id oraz kolejny z już istniejącym adresem, który nie pokazuje się w widoku w subiekcie na dodanym kontrahencie.

image.thumb.png.7d8da3fce846cbb26fbf298e4b320541.png

Na naszych testowych podmiotach (z danymi prezentacyjnymi) taki problem nie występuje, po dodaniu w aplikacji mobilnej kontrahenta z adresem i wysłaniu go poprzez sferę by dodało go w nexo, w tabeli Adresy powstaje jeden wpis a w samym nexo w kontrahencie widnieje wpisany adres.

 

Powyższy schemat nie był nam zgłaszany przez żadnego z innych klientów. 

 

Czym taka sytuacja może być spowodowana? Funkcja była tworzona według przykładów zamieszczonych w sdk, ale być może jest coś co powinniśmy jeszcze dodać/zmienić w niej. Klient posiada również Gestora, czy to ma jakiś wpływ na to? Aktualna wersja nexo to 45.0.1.

    public Contractor AddOrEditContractor(Common.Models.Contractor contractor, LoginModel loginData)
        {
            var sfera = UruchomSfere(loginData);
            IPodmioty podmioty = sfera.PodajObiektTypu<IPodmioty>();
            IPanstwa panstwa = sfera.PodajObiektTypu<IPanstwa>();
            IGrupy grupy = sfera.PodajObiektTypu<IGrupy>();
            IRodzajeKontaktuDaneDomyslne rodzajeKontaktuDD = sfera.PodajObiektTypu<IRodzajeKontaktu>().DaneDomyslne;
            IStanowiskaDaneDomyslne stanowiskaDD = sfera.PodajObiektTypu<IStanowiska>().DaneDomyslne;
            IDzialyPodmiotuDaneDomyslne dzialyDD = sfera.PodajObiektTypu<IDzialyPodmiotu>().DaneDomyslne;

            ITypyAdresowDaneDomyslne typyAdresuDD = sfera.PodajObiektTypu<ITypyAdresu>().DaneDomyslne;
            var telefonRodzaj = sfera.PodajObiektTypu<IRodzajeKontaktu>().DaneDomyslne.Telefon;
            var emailRodzaj = sfera.PodajObiektTypu<IRodzajeKontaktu>().DaneDomyslne.Email;

            Podmiot podmiot = null;

            if (string.IsNullOrEmpty(contractor.Id))//dodajemy kontrahenta
            {
                using (var podmiotBO = podmioty.UtworzFirme())
                {
                    int id = podmioty.Dane.Wszystkie().Select(a => a.Id).Max() + 1;
                    podmiotBO.Dane.Sygnatura.PelnaSygnatura = $"4SALES {id}";
                    podmiotBO.Dane.Firma.Nazwa = contractor.FullName ?? string.Empty;
                    podmiotBO.Dane.NIP = contractor.NIP ?? string.Empty;
                    podmiotBO.Dane.NazwaSkrocona = contractor.Name;

                    if (string.IsNullOrEmpty(contractor.ContractorGroup.Name)) podmiotBO.Dane.Grupy.Clear();
                    else
                    {
                        using (var grupa = grupy.Znajdz(contractor.ContractorGroup.Name))
                        {
                            if (grupa != null) podmiotBO.Dane.Grupy.Add(grupa.Dane);
                        }
                    }

                    var adresGlowny = podmiotBO.DodajAdres(typyAdresuDD.Glowny);
                    adresGlowny.Szczegoly.Ulica = contractor.Address ?? string.Empty;
                    adresGlowny.Szczegoly.NrDomu = contractor.House ?? string.Empty;
                    adresGlowny.Szczegoly.NrLokalu = contractor.Local ?? string.Empty;
                    adresGlowny.Szczegoly.KodPocztowy = contractor.CityCode ?? string.Empty;
                    adresGlowny.Szczegoly.Miejscowosc = contractor.City ?? string.Empty;

                    if (!string.IsNullOrEmpty(contractor.SupplyAddress))
                    {
                        var adresK = podmiotBO.DodajAdres(typyAdresuDD.DoWysylki);

                        adresK.Szczegoly.Ulica = contractor.SupplyAddress ?? string.Empty;
                        adresK.Szczegoly.NrDomu = contractor.SupplyHouse ?? string.Empty;
                        adresK.Szczegoly.NrLokalu = contractor.SupplyLocal ?? string.Empty;
                        adresK.Szczegoly.KodPocztowy = contractor.SupplyCityCode ?? string.Empty;
                        adresK.Szczegoly.Miejscowosc = contractor.SupplyCity ?? string.Empty;

                        adresK.Nazwa = contractor.SupplyName;
                        var address = $"{contractor.SupplyAddress} {contractor.SupplyHouse}";
                        adresK.Linia1 = address;
                        if (!string.IsNullOrEmpty(contractor.SupplyLocal))
                            adresK.Linia1 = $"{address}/{contractor.SupplyLocal}";
                        adresK.Linia2 = $"{contractor.SupplyCityCode} {contractor.SupplyCity}";
                    }

                    var podstawowy = true;
                    foreach (var phone in contractor.Phones)
                    {
                        var nowy = new Kontakt();
                        podmiotBO.Dane.Kontakty.Add(nowy);
                        nowy.Rodzaj = rodzajeKontaktuDD.Telefon;
                        nowy.Wartosc = phone.PhoneNumber;
                        if (!podstawowy) continue;
                        nowy.Podstawowy = true;
                        podstawowy = false;
                    }

                    if (!string.IsNullOrEmpty(contractor.Email))
                    {
                        var kontakt = new Kontakt();
                        podmiotBO.Dane.Kontakty.Add(kontakt);
                        kontakt.Rodzaj = rodzajeKontaktuDD.Email;
                        kontakt.Wartosc = contractor.Email;
                        kontakt.Podstawowy = true;
                    }

                    if (!podmiotBO.Zapisz())
                    {
                        podmiotBO.WypiszBledy();
                        var bledy = sfera.PodajBledy(podmiotBO);
                        var sb = new StringBuilder();
                        foreach (var blad in bledy)
                        {
                            sb.AppendLine($"Ważność: {blad.Waznosc.ToString()}, Informacja: {blad.Tresc}");
                        }

                        throw new Exception(sb.ToString());
                    }

                    contractor.Id = podmiotBO.Dane.Id.ToString();
                }
            }
            else
            {
                var contractorId = Convert.ToInt32(contractor.Id);
                podmiot = sfera.PodajObiektTypu<IPodmioty>().Dane.Wszystkie()
                    .SingleOrDefault(s => s.Id == contractorId);
                if (podmiot == null)
                    throw new Exception(
                        $"Nie odnaleziono kontrahenta o id: {contractor.Id} i nazwie: {contractor.Name}");
                using (var podmiotEdit = podmioty.Znajdz(podmiot))
                {
                    podmiotEdit.Dane.NazwaSkrocona = contractor.Name;
                    podmiotEdit.Dane.Firma.Nazwa = contractor.FullName ?? string.Empty;
                    podmiotEdit.Dane.AdresPodstawowy.Szczegoly.Ulica = contractor.Address ?? string.Empty;
                    podmiotEdit.Dane.AdresPodstawowy.Szczegoly.NrDomu = contractor.House ?? string.Empty;
                    podmiotEdit.Dane.AdresPodstawowy.Szczegoly.NrLokalu = contractor.Local ?? string.Empty;
                    podmiotEdit.Dane.AdresPodstawowy.Szczegoly.KodPocztowy = contractor.CityCode ?? string.Empty;
                    podmiotEdit.Dane.AdresPodstawowy.Szczegoly.Miejscowosc = contractor.City ?? string.Empty;
                    podmiotEdit.Dane.NIP = contractor.NIP ?? string.Empty;

                    if (string.IsNullOrEmpty(contractor.ContractorGroup.Name)) podmiotEdit.Dane.Grupy.Clear();
                    else
                    {
                        using (var grupa = grupy.Znajdz(contractor.ContractorGroup.Name))
                        {
                            if (grupa != null) podmiotEdit.Dane.Grupy.Add(grupa.Dane);
                        }
                    }

                    if (!string.IsNullOrWhiteSpace(contractor.SupplyName) ||
                        !string.IsNullOrWhiteSpace(contractor.SupplyAddress) ||
                        !string.IsNullOrWhiteSpace(contractor.SupplyCityCode) ||
                        !string.IsNullOrWhiteSpace(contractor.SupplyCity))
                    {
                        AdresPodmiotu adresWysylki;
                        if (podmiotEdit.Dane.DomyslnyAdresDostaw == null)
                        {
                            var doWysylki = sfera.PodajObiektTypu<ITypyAdresu>().DaneDomyslne.DoWysylki;
                            adresWysylki = podmiotEdit.DodajAdres(doWysylki);
                        }
                        else
                        {
                            adresWysylki = podmiotEdit.Dane.DomyslnyAdresDostaw;
                        }

                        adresWysylki.Nazwa = contractor.SupplyName;
                        adresWysylki.Szczegoly.Ulica = contractor.SupplyAddress;
                        adresWysylki.Szczegoly.NrDomu = contractor.SupplyHouse;
                        adresWysylki.Szczegoly.NrLokalu = contractor.SupplyLocal;
                        adresWysylki.Szczegoly.KodPocztowy = contractor.SupplyCityCode;
                        adresWysylki.Szczegoly.Miejscowosc = contractor.SupplyCity;

                        var address = $"{contractor.SupplyAddress} {contractor.SupplyHouse}";
                        adresWysylki.Linia1 = address;
                        if (!string.IsNullOrEmpty(contractor.SupplyLocal))
                            adresWysylki.Linia1 = $"{address}/{contractor.SupplyLocal}";
                        adresWysylki.Linia2 = $"{contractor.SupplyCityCode} {contractor.SupplyCity}";

                        adresWysylki.Panstwo = panstwa.Dane.Wszystkie().FirstOrDefault(p =>
                            string.Compare(p.Nazwa, "Polska", StringComparison.Ordinal) == 0);
                    }


                    //edytowanie/usuwanie emailu
                    var email = podmiotEdit.Dane.Kontakty.FirstOrDefault(d =>
                        d.Rodzaj.Id == emailRodzaj.Id && d.Podstawowy);
                    if (!string.IsNullOrEmpty(contractor.Email))
                    {
                        if (email != null)
                            podmiotEdit.Dane.Kontakty.First(d => d.Rodzaj.Id == emailRodzaj.Id && d.Podstawowy).Wartosc
                                = contractor.Email;
                    }
                    else if (email != null)
                        podmiotEdit.UsunKontakt(email);

                    //***********edytowanie/dodawanie/usuwanie telefonów*************
                    var phones = podmiotEdit.Dane.Kontakty.Where(s => s.Rodzaj.Id == telefonRodzaj.Id).ToList();
                    //usuwamy wszystkie telefony
                    for (var i = 0; i < phones.ToList().Count; i++)
                    {
                        var phone = podmiotEdit.Dane.Kontakty.First(s => s.Rodzaj.Id == telefonRodzaj.Id);
                        podmiotEdit.UsunKontakt(phone);
                    }
                    //dodajemy wszystkie z aplikacji
                    var podstawowy = true;

                    foreach (var phone in contractor.Phones)
                    {
                        var nowy = new Kontakt();
                        podmiotEdit.Dane.Kontakty.Add(nowy);
                        nowy.Rodzaj = rodzajeKontaktuDD.Telefon;
                        nowy.Wartosc = phone.PhoneNumber;
                        if (!podstawowy) continue;
                        nowy.Podstawowy = true;
                        podstawowy = false;
                    }

                    if (!podmiotEdit.Zapisz())
                    {
                        podmiotEdit.WypiszBledy();
                        var bledy = sfera.PodajBledy(podmiotEdit);
                        var sb = new StringBuilder();
                        foreach (var blad in bledy)
                        {
                            sb.AppendLine($"Ważność: {blad.Waznosc.ToString()}, Informacja: {blad.Tresc}");
                        }
                        throw new Exception(sb.ToString());
                    }
                }
            }
            return contractor;
        }

 

Link to postu
W dniu 5.05.2023 o 13:30, Radomił Ząbik napisał:

Zacząłbym od sprawdzenia czy ten konkretny klient nie ma na bazie jakiś triggerów, np. dodanych przez jakieś rozwiązania własne.

Baza nigdy nie była modyfikowana poza programami Inserta nexo. Nie tam żadnych własnych rozwiązań. Oprócz oczywiście 4Sales.

Link to postu

A trafiają też dane do powiązanych tablic Adresy_AdresPodmiotu oraz AdresySzczegoly? Na innych podmiotach, na których działa wasze rozwiązanie, też już macie wersję 45.x.x - bo może rzeczywiście tutaj jest jakiś babol, to się Insert pewnie już po weekendzie wypowie? Bardzo dziwna jest sytuacja, że macie problem tylko i wyłącznie z jednym klientem i szukałbym w tym kliencie problemu. Rozumiem, że ten brak rozwiązań własnych, zweryfikowaliście osobiście na bazie, sprawdzają tablice związane z adresami (już też słyszałem historie, że nic nie było, a potem kilka godzin walki, a jednak ktoś wkleił kod z internetu). Zerknąłbym jeszcze na szablon klienta, porównał go z domyślnym ustawionym na podmiocie prezentacyjnym, tam też są dane związane z adresem, może tam coś klient namieszał, może są tam np. puste dane, nie jako NULL. Ciężko się przyczepić do waszego kodu, chyba że dane jakieś puste poszły - a to ID 101116, to efekt dodania adresu głównego, czy adresu wysyłki? Jeszcze bym spróbował bez modyfikowania Linia1/Linia2, bo może tutaj jest jakiś konflikt, ostatecznie zrobił na szybko programik na podstawie kodu z SDK i zobaczył, czy na tak prostym z ręki wpisanym, też się kaszani. Tyle co mogę podrzucić przemyśleń, do podłubania przez weekend, chociaż pewnie większość już przetestowaliście ;)

Link to postu

Prawdopodobnie w domyślnym szablonie firmy w sekcji adresu wybrane jest jakieś państwo, co powoduje, że przy dodawaniu nowej firmy automatycznie dodawany jest adres główny, więc wywołanie metody podmiotBO.DodajAdres(typyAdresuDD.Glowny) spowoduje dodanie kolejnego adresu głównego. W takim przypadku wystarczy sprawdzić czy adres główny nie został już dodany i edytować go, zamiast dodawać kolejny:
 

var adresGlowny = podmiotBO.Dane.Adresy.FirstOrDefault(a => a.TypAdresu?.Id == typyAdresuDD.Glowny.Id) ?? podmiotBO.DodajAdres(typyAdresuDD.Glowny);

 

  • Lubię to 1
Link to postu
×
×
  • Dodaj nową pozycję...