Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision c13b0ae6

Von Tamino Steinert vor 9 Monaten hinzugefügt

  • ID c13b0ae644be830b117589784d02c7e0cfdac444
  • Vorgänger 7d9823cd
  • Nachfolger caec05b1

EmailJournal: Suche nach E-Mail von Kunde und Lieferant getrennt

Unterschiede anzeigen:

SL/Controller/EmailJournal.pm
254 254
  my @record_types_with_info = $self->get_record_types_with_info();
255 255
  my %record_types_to_text   = $self->get_record_types_to_text();
256 256

  
257
  my $customer_vendor = $self->find_customer_vendor_from_email($self->entry);
258
  my $cv_type = $customer_vendor && $customer_vendor->is_vendor ? 'vendor' : 'customer';
259

  
260
  my $record_types = $self->record_types_for_customer_vendor_type_and_action($cv_type, 'workflow_record');
257
  my $customer = $self->find_customer_vendor_from_email('customer', $self->entry);
258
  my $vendor   = $self->find_customer_vendor_from_email('vendor'  , $self->entry);
259
  my $cv_type_found;
260
  $cv_type_found   = 'vendor' if $self->entry->record_type eq 'ap_transaction';
261
  $cv_type_found ||= 'vendor' if defined $vendor;
262
  $cv_type_found ||= 'customer';
263

  
264
  my $record_types = $self->record_types_for_customer_vendor_type_and_action(
265
    $cv_type_found, 'workflow_record'
266
  );
261 267

  
262 268
  $self->setup_show_action_bar;
263
  my $cv_type_found = $customer_vendor && $customer_vendor->is_vendor ? 'vendor' : 'customer';
264
  # overwrite on record_type
265
  $cv_type_found = 'vendor' if $self->entry->record_type eq 'ap_transaction';
266 269
  $self->render(
267 270
    'email_journal/show',
268 271
    title                  => $::locale->text('View email'),
269
    CUSTOMER_VENDOR        => $customer_vendor,
272
    CUSTOMER               => $customer,
273
    VENDOR                 => $vendor,
270 274
    CV_TYPE_FOUND          => $cv_type_found,
271 275
    RECORD_TYPES_WITH_INFO => \@record_types_with_info,
272 276
    RECORD_TYPES_TO_TEXT   => \%record_types_to_text,
......
607 611
}
608 612

  
609 613
sub find_customer_vendor_from_email {
610
  my ($self, $email_journal, $cv_type) = @_;
614
  my ($self, $cv_type, $email_journal) = @_;
615

  
616
  my $manager = $cv_type eq 'customer' ? 'SL::DB::Manager::Customer'
617
              : $cv_type eq 'vendor'   ? 'SL::DB::Manager::Vendor'
618
              : die "No valid customer vendor option: $cv_type";
619

  
611 620
  my $email_address = $email_journal->from;
612 621
  $email_address =~ s/.*<(.*)>/$1/; # address can look like "name surname <email_address>"
613 622

  
614 623
  # Separate query otherwise cv without contacts and shipto is not found
615 624
  my $customer_vendor;
616
  foreach my $manager (qw(SL::DB::Manager::Customer SL::DB::Manager::Vendor)) {
617
    $customer_vendor ||= $manager->get_first(
618
      where => [
619
        or => [
620
          email => $email_address,
621
          cc    => $email_address,
622
          bcc   => $email_address,
623
        ],
625
  $customer_vendor ||= $manager->get_first(
626
    where => [
627
      or => [
628
        email => $email_address,
629
        cc    => $email_address,
630
        bcc   => $email_address,
624 631
      ],
625
    );
626
    $customer_vendor ||= $manager->get_first(
627
      where => [
628
        or => [
629
          'contacts.cp_email' => $email_address,
630
          'contacts.cp_privatemail' => $email_address,
631
        ],
632
    ],
633
  );
634
  $customer_vendor ||= $manager->get_first(
635
    where => [
636
      or => [
637
        'contacts.cp_email' => $email_address,
638
        'contacts.cp_privatemail' => $email_address,
632 639
      ],
633
      with_objects => [ 'contacts'],
634
    );
640
    ],
641
    with_objects => [ 'contacts'],
642
  );
643
  $customer_vendor ||= $manager->get_first(
644
    where => [
645
      or => [
646
        'shipto.shiptoemail' => $email_address,
647
      ],
648
    ],
649
    with_objects => [ 'shipto' ],
650
  );
651
  if ($manager eq 'SL::DB::Manager::Customer') {
635 652
    $customer_vendor ||= $manager->get_first(
636 653
      where => [
637 654
        or => [
638
          'shipto.shiptoemail' => $email_address,
655
          'additional_billing_addresses.email' => $email_address,
639 656
        ],
640 657
      ],
641
      with_objects => [ 'shipto' ],
658
      with_objects => [ 'additional_billing_addresses' ],
642 659
    );
643
    if ($manager eq 'SL::DB::Manager::Customer') {
644
      $customer_vendor ||= $manager->get_first(
645
        where => [
646
          or => [
647
            'additional_billing_addresses.email' => $email_address,
648
          ],
649
        ],
650
        with_objects => [ 'additional_billing_addresses' ],
651
      );
652
    }
653 660
  }
654 661

  
655 662
  # if no exact match is found search for domain and match only on one hit
......
657 664
    my $email_domain = $email_address;
658 665
    $email_domain =~ s/.*@(.*)/$1/;
659 666
    my @domain_hits_cusotmer_vendor = ();
660
    foreach my $manager (qw(SL::DB::Manager::Customer SL::DB::Manager::Vendor)) {
661
      my @domain_hits = ();
662
      push @domain_hits, @{$manager->get_all(
663
        where => [
664
          or => [
665
            email => {ilike => "%$email_domain"},
666
            cc    => {ilike => "%$email_domain"},
667
            bcc   => {ilike => "%$email_domain"},
668
          ],
667
    my @domain_hits = ();
668
    push @domain_hits, @{$manager->get_all(
669
      where => [
670
        or => [
671
          email => {ilike => "%$email_domain"},
672
          cc    => {ilike => "%$email_domain"},
673
          bcc   => {ilike => "%$email_domain"},
669 674
        ],
670
      )};
671
      push @domain_hits, @{$manager->get_all(
672
        where => [
673
          or => [
674
            'contacts.cp_email'       => {ilike => "%$email_domain"},
675
            'contacts.cp_privatemail' => {ilike => "%$email_domain"},
676
          ],
675
      ],
676
    )};
677
    push @domain_hits, @{$manager->get_all(
678
      where => [
679
        or => [
680
          'contacts.cp_email'       => {ilike => "%$email_domain"},
681
          'contacts.cp_privatemail' => {ilike => "%$email_domain"},
677 682
        ],
678
        with_objects => [ 'contacts'],
679
      )};
680
      push @domain_hits, @{$manager->get_all(
681
        where => [
682
          or => [
683
            'shipto.shiptoemail' => {ilike => "%$email_domain"},
684
          ],
683
      ],
684
      with_objects => [ 'contacts'],
685
    )};
686
    push @domain_hits, @{$manager->get_all(
687
      where => [
688
        or => [
689
          'shipto.shiptoemail' => {ilike => "%$email_domain"},
685 690
        ],
686
        with_objects => [ 'shipto' ],
687
      )};
691
      ],
692
      with_objects => [ 'shipto' ],
693
    )};
694
    push @domain_hits, @{$manager->get_all(
695
      where => [
696
        or => [
697
          'shipto.shiptoemail' => {ilike => "%$email_domain"},
698
        ],
699
      ],
700
      with_objects => [ 'shipto' ],
701
    )};
702
    if ($manager eq 'SL::DB::Manager::Customer') {
688 703
      push @domain_hits, @{$manager->get_all(
689 704
        where => [
690 705
          or => [
691
            'shipto.shiptoemail' => {ilike => "%$email_domain"},
706
            'additional_billing_addresses.email' => {ilike => "%$email_domain"},
692 707
          ],
693 708
        ],
694
        with_objects => [ 'shipto' ],
709
        with_objects => [ 'additional_billing_addresses' ],
695 710
      )};
696
      if ($manager eq 'SL::DB::Manager::Customer') {
697
        push @domain_hits, @{$manager->get_all(
698
          where => [
699
            or => [
700
              'additional_billing_addresses.email' => {ilike => "%$email_domain"},
701
            ],
702
          ],
703
          with_objects => [ 'additional_billing_addresses' ],
704
        )};
705
      }
706
      # get every customer_vendor only once
707
      my %id_to_customer_vendor = ();
708
      $id_to_customer_vendor{$_->id} = $_ for @domain_hits;
709
      push @domain_hits_cusotmer_vendor, $id_to_customer_vendor{$_} for keys %id_to_customer_vendor;
710 711
    }
711

  
712
    if (scalar @domain_hits_cusotmer_vendor == 1) {
713
      $customer_vendor = $domain_hits_cusotmer_vendor[0];
712
    # update on only one unique customer_vendor
713
    if (scalar @domain_hits) {
714
      my $first_customer_vendor = $domain_hits[0];
715
      unless (any {$_->id != $first_customer_vendor->id} @domain_hits) {
716
        $customer_vendor = $first_customer_vendor;
717
      }
714 718
    }
715 719
  }
716 720

  

Auch abrufbar als: Unified diff